Objective c 为什么NSURL';s NSURLDocumentIdentifierKey(几乎)始终为零?
OSX Yosemite在NSURL上引入了一个非常方便的属性:Objective c 为什么NSURL';s NSURLDocumentIdentifierKey(几乎)始终为零?,objective-c,macos,cocoa,filesystems,osx-yosemite,Objective C,Macos,Cocoa,Filesystems,Osx Yosemite,OSX Yosemite在NSURL上引入了一个非常方便的属性:NSURLDocumentIdentifierKey 引用文件: NSURLDocumentIdentifierKey 作为NSNumber返回的文档标识符(只读)。 文档标识符是内核分配给文件或目录的值。此值用于标识文档,无论文档在卷上移动到何处。标识符在系统重新启动时保持不变。复制文件时不会传输,但会保留下来“安全保存”操作。例如,即使在调用replaceItemAttribute:WithItemAttribute:backu
NSURLDocumentIdentifierKey
引用文件:
NSURLDocumentIdentifierKey
作为NSNumber返回的文档标识符(只读)。
文档标识符是内核分配给文件或目录的值。此值用于标识文档,无论文档在卷上移动到何处。标识符在系统重新启动时保持不变。复制文件时不会传输,但会保留下来“安全保存”操作。例如,即使在调用replaceItemAttribute:WithItemAttribute:backupItemName:options:resultingItemURL:error:method之后,它仍保留在分配给它的路径上。文档标识符仅在单个卷中是唯一的。并非所有卷都支持此属性
在OS X v10.10和iOS 8.0中提供
不幸的是,该值似乎大多为零(除了极少数几个看起来彼此完全断开连接的示例)
特别是,此代码将在最后一行抛出异常(在Yosemite 10.10.3上测试):
也许我误解了文档,但在我看来,磁盘上的每个文件上都应该有
NSURLDocumentIdentifierKey
。显然,只有当Yosemite知道某个文件正在试图跟踪其标识(如版本或iCloud)时,它才会将DocumentIdentifier分配给该文件
我看不出有任何方法可以与内核对话,并告诉它开始跟踪您感兴趣的文件。我希望在未来的版本中能有所改变,因为API已经在OS X 10.10上公开了,目前它基本上是无用的。我向苹果公司提交了一个关于这个问题的bug,并得到了我报告的反馈。截至今天,有关跟踪
DocumentIdentifier
的信息尚未包含在文档中,但票据仍处于打开状态
缺少的信息是,默认情况下,文件系统不跟踪DocumentIdentifier
。您必须通过使用UF_TRACKED
标志在要跟踪的每个文件上设置标志来启用跟踪
以下脚本将打印文件的DocumentIdentifier
:
此脚本将启用对文档标识符的跟踪:
这个问题在macOS 10.14中仍然存在。它可能不会改变
解决方法是从NSFileManager
获取inode,如下所示:
NSFileManager *fmgr = [NSFileManager defaultManager];
NSDictionary *attributes = [fmgr attributesOfItemAtPath:url.path error:nil;
if (attributes != nil) {
NSNumber *inode = [attributes objectForKey:NSFileSystemFileNumber];
...
}
这里涉及沙箱吗?我不这么认为:我根本没有使用沙箱。除非这是一个MAS特有的功能,但我不这么认为。我想知道如果在很多文件上启用它,会对性能产生什么影响。非常有趣。我还想知道会对性能产生什么影响。而且如果它能在网络文件系统上工作。
NSFileManager *fmgr = [NSFileManager defaultManager];
NSDictionary *attributes = [fmgr attributesOfItemAtPath:url.path error:nil;
if (attributes != nil) {
NSNumber *inode = [attributes objectForKey:NSFileSystemFileNumber];
...
}