Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 设置Cocoa中符号链接的修改日期_Macos_Cocoa_Attributes_Symlink_Nsfilemanager - Fatal编程技术网

Macos 设置Cocoa中符号链接的修改日期

Macos 设置Cocoa中符号链接的修改日期,macos,cocoa,attributes,symlink,nsfilemanager,Macos,Cocoa,Attributes,Symlink,Nsfilemanager,在Cocoa中,我想设置符号链接的修改日期 使用[NSFileManager setAttributes:ofItemAtPath:error:可以很好地处理常规文件,但不能处理符号链接 如何实现这一点?使用NSFileManager无法直接实现。setAttributes:ofItemAtPath:error:method封装了一组基于BSD路径的函数,如utimes、setxattr、chown等,所有这些函数都遵循符号链接,而不是直接对它们进行操作 一个明显的替代方法是手动下拉到BSD层。

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

使用
[NSFileManager setAttributes:ofItemAtPath:error:
可以很好地处理常规文件,但不能处理符号链接


如何实现这一点?

使用NSFileManager无法直接实现。setAttributes:ofItemAtPath:error:method封装了一组基于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);
如果您计划做很多这方面的工作,那么您可以在NSFileManager上的一个类别中编写自己的setAttributes:of SymLinkatPath:error:implementation,该类别包含无用时间、fchflags、fsetxattr等

唯一真正的问题是,你需要有对符号链接本身的读取权限(以及修改mod time等所需的任何访问权限),但这通常不是问题,据我所知,OSX无论如何也无法解决。(Linux允许您打开既不具有读写访问权限的文件,只是为了进行f*调用,但BSD不允许。)

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


谢谢你的完整回答。不幸的是,NSURL的东西似乎不起作用,但徒劳的事情让我感兴趣。第二个参数是struct timeval,但它只包含秒。。。例如,如果我输入50000秒,则文件日期根本不会更改。我做错什么了吗?NSURL终于工作得很好了!唯一的问题是用简单的日期替换[NSDate date]。非常感谢。抱歉耽搁了;在发布这个答案后不久,我休息了一周。第二个参数是两个struct timeval的数组(衰减为指向struct timeval的指针),而不是struct timeval。如果传递0,它将使用当前时间。手册页应该解释所有这些。我不确定“用简单的日期替换[NSDate date]是什么意思”。这里的参数是NSDate*。如果你碰巧有一个叫做“日期”的东西,你想用它,当然你可以传递它。传递“[NSDate date]”将使用当前时间。
[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil];