NSFileManager 中的错误(实例方法是遍历符号链接)

Posted

技术标签:

【中文标题】NSFileManager 中的错误(实例方法是遍历符号链接)【英文标题】:Bug in NSFileManager (instance method is traversing symbolic link) 【发布时间】:2012-03-21 12:36:04 【问题描述】:

我正在使用copyItemAtPath:toPath:error: 进行复制操作。来自文档:

符号链接不被遍历,而是被复制

但此方法正在遍历符号链接并复制 ln -s(在 10.5 中)创建的符号链接的原始内容。kMDItemFSFinderFlags 对于 ln -s 创建的别名为零。attributesOfItemAtPath:error: returns NSFileType = NSFileTypeSymbolicLink

来自What's the difference between alias and link?

别名包含两条信息: 它链接到的文件,以及它链接的文件的路径和文件名 到。

如果重命名或移动文件,然后使用路径创建新文件 和文件最初具有的文件名,然后是链接的任何别名 到原始文件的链接现在链接到新文件。

但是,如果您重命名或移动文件而不替换它,然后 调用别名,别名将更新为指向新路径并 文件名,使用唯一标识符。

另一方面,符号链接不包含唯一的 文件的标识符,如果文件是 重命名或移动,而不是用相同路径的文件替换,并且 文件名。

当我使用

创建别名时
tell application "Finder"
    make new alias at POSIX file "/Users/test/" to POSIX file "/Applications/Safari.app"
end tell

copyItemAtPath:toPath:error: 工作正常,kMDItemFSFinderFlags = 33792

attributesOfItemAtPath:error: returns NSFileType = NSFileTypeRegular; 

谁能帮帮我?

【问题讨论】:

【参考方案1】:

如果这确实是一个错误,请尝试改用 copyfile()(C 函数,手册第 3 节)。

【讨论】:

如果文件是符号链接 (4KB),则 copyfile() 在 10.5 中复制零 KB。在 10.6 中它工作正常。 copyfile((const char *)[srcpath UTF8String], (const char *)[destpath UTF8String], state, COPYFILE_DATA | COPYFILE_XATTR | COPYFILE_STAT | COPYFILE_ACL | COPYFILE_NOFOLLOW_SRC); 奇怪,copyfile() 处理符号链接,提示问题的原因是别的…… copyfile() 是否返回错误结果? errno 的值是多少?您可以尝试使用destinationOfSymbolicLinkAtPath:error:(readlink() 的包装器)和createSymbolicLinkAtPath:withDestinationPath:error:(symlink() 的包装器)自己复制链接 - 随时检查结果。

以上是关于NSFileManager 中的错误(实例方法是遍历符号链接)的主要内容,如果未能解决你的问题,请参考以下文章

NSFileManager 多实例写入原子性

NSFilemanager 委托方法中的 syslog

OSX:如何访问 NSFileManager 方法 contentsOfDirectoryAtUrl 中的属性:

NSFileManager 线程安全

Foundation框架中的NSFileManager一

我们如何关闭 NSFileManager?