在 Cocoa 中,我想设置符号链接的修改日期。
使用[NSFileManager setAttributes:ofItemAtPath:error:]
常规文件效果很好,但不适用于符号链接。
我怎样才能做到这一点?
在 Cocoa 中,我想设置符号链接的修改日期。
使用[NSFileManager setAttributes:ofItemAtPath:error:]
常规文件效果很好,但不适用于符号链接。
我怎样才能做到这一点?
没有办法直接用 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 等。
唯一真正的问题是您需要对符号链接本身具有读取访问权限(以及修改 mod 时间所需的任何访问权限等)才能使其正常工作,但这通常不是问题,而且到目前为止据我所知,OS X 无论如何都无法解决它。(Linux 确实允许您打开一个既不是读也不是写访问的文件,只是为了进行 f* 调用,但 BSD 不允许。)
作为另一种选择,我相信 NSURL 文件 URL API不遵循符号链接,这意味着这应该可以工作(但我现在不在我的 Mac 前,所以我无法测试):
[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil];