在Cocoa中,我想设置符号链接的修改日期。
使用[NSFileManager setAttributes:ofItemAtPath:error:]
可以很好地处理常规文件,但不能使用符号链接。
我怎样才能做到这一点?
答案 0 :(得分:6)
无法直接使用NSFileManager进行此操作。 setAttributes:ofItemAtPath:error:方法包含了一堆基于路径的BSD函数,如utimes,setxattr,chown等,所有这些函数都遵循符号链接,而不是直接对它们进行操作。
一个明显的选择是手动下拉到BSD层。有些函数有“不遵循符号链接”的版本,比如lchown,但并非所有版本都有。特别是,改变mod时间的那个,utimes,却没有。所以你必须打开文件并使用基于fd的变体,futimes。这是代码的样子:
int fd = open([NSFileManager fileSystemRepresentationWithPath:path], O_RDONLY | O_SYMLINK);
futimes(fd, 0);
close(fd);
如果你打算做很多这样的事情,你可以编写自己的setAttributes:ofSymlinkAtPath:error:在NSFileManager上的一个类别中实现,它包含了futimes,fchflags,fsetxattr等。
唯一真正的问题是你需要对符号链接本身有读取权限(以及修改模式时间所需的任何访问权限等)才能使用,但这通常不是问题,据我所知,OS X无论如何都无法绕过它。 (Linux确实允许你打开文件既不读也不写,只是做f *调用,但BSD没有。)
作为另一种选择,我相信NSURL文件URL API 不遵循符号链接,这意味着这应该有效(但我现在不在我的Mac前面,所以我不能试验):
[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil];