3

在 Cocoa 中,我想设置符号链接的修改日期。

使用[NSFileManager setAttributes:ofItemAtPath:error:]常规文件效果很好,但不适用于符号链接。

我怎样才能做到这一点?

4

1 回答 1

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 等。

唯一真正的问题是您需要对符号链接本身具有读取访问权限(以及修改 mod 时间所需的任何访问权限等)才能使其正常工作,但这通常不是问题,而且到目前为止据我所知,OS X 无论如何都无法解决它。(Linux 确实允许您打开一个既不是读也不是写访问的文件,只是为了进行 f* 调用,但 BSD 不允许。)

作为另一种选择,我相信 NSURL 文件 URL API遵循符号链接,这意味着这应该可以工作(但我现在不在我的 Mac 前,所以我无法测试):

[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil];
于 2012-05-16T02:03:17.263 回答