Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Objective c 为什么NSURL';s NSURLDocumentIdentifierKey(几乎)始终为零?_Objective C_Macos_Cocoa_Filesystems_Osx Yosemite - Fatal编程技术网

Objective c 为什么NSURL';s NSURLDocumentIdentifierKey(几乎)始终为零?

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

OSX Yosemite在NSURL上引入了一个非常方便的属性:
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];
    ...
}