2012-05-15 32 views

回答

6

有没有办法直接与NSFileManager做到这一点。 setAttributes:ofItemAtPath:error:方法包装了一系列基于BSD路径的函数,如utimes,setxattr,chown等,它们都遵循符号链接,而不是直接对它们进行操作。

一个明显的选择是手动下拉到BSD层。一些函数具有“不遵循符号链接”的版本,比如lchown,但并不是所有的都有。特别是,改变mod时间的那个,不是。所以你必须打开文件并使用基于fd的变体futimes。下面的代码是什么样子:

int fd = open([NSFileManager fileSystemRepresentationWithPath:path], O_RDONLY | O_SYMLINK); 
futimes(fd, 0); 
close(fd); 

如果你打算做了很多这方面,你可以写自己的setAttributes:ofSymlinkAtPath:错误:实施上的NSFileManager一个类别,它包装起来futimes,fchflags,fsetxattr等

唯一真正的问题是,你需要有读取权限的符号链接本身(以及任何访问你需要修改MOD时间等),这个工作,但通常不是问题,就我所知,无论如何,OS X都无法解决问题。 (Linux确实让你打开一个文件既不读也不写访问,只是做f *调用,但BSD不行)

作为另一种替代方法,我相信NSURL文件URL APIs不会遵循符号链接,这意味着这应该工作(但我现在不在我的Mac前面,所以我不能测试):

[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil]; 
+0

感谢您的完整答案。不幸的是,NSURL的东西似乎并不奏效,然而,倍感兴趣的是我。第二个参数是一个结构timeval,但它只包含秒...如果我举例如50000秒,文件日期根本不会改变。我做错了什么吗? –

+0

NSURL终于完美工作!唯一的事情就是用简单的日期来替换[NSDate date]。谢谢 !! –

+0

对不起,发布这个答案后不久我就休息了一个星期。第二个参数是一个由两个结构时间值组成的数组(它衰减到一个指向结构timeval的指针),而不是一个结构timeval。如果你传递0,它使用当前时间。手册页应解释所有这一切。 – abarnert