【发布时间】:2019-05-03 20:19:27
【问题描述】:
OSX Yosemite 在 NSURL 上引入了一个非常方便的属性:NSURLDocumentIdentifierKey。
引用文档:
NSURLDocumentIdentifierKey
以 NSNumber 形式返回的文档标识符(只读)。 文档标识符是内核分配给文件或目录的值。无论文档在卷上移动到何处,此值都用于标识文档。该标识符在系统重新启动后仍然存在。复制文件时不会传输它,但它会在“安全保存”操作中继续存在。例如,即使在调用 replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error: 方法之后,它仍保留在分配给它的路径上. 文档标识符仅在单个卷中是唯一的。并非所有卷都支持此属性。
在 OS X v10.10 和 iOS 8.0 中可用。
不幸的是,该值似乎大部分为 nil(除了极少数的例子,它们之间似乎完全断开)。
特别是,此代码将在最后一行抛出异常(在 Yosemite 10.10.3 上测试):
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *attributesFlags = @[NSURLNameKey, mNSURLDocumentIdentifierKey];
NSDirectoryEnumerator *en = [fileManager enumeratorAtURL:[NSURL URLWithString:NSHomeDirectory()]
includingPropertiesForKeys:attributesFlags
options:NSDirectoryEnumerationSkipsHiddenFiles
errorHandler:^BOOL(NSURL *url, NSError *error) {
NSAssert(NO, @"An error has occured");
return YES;
}];
for(NSURL *URL in en) {
NSNumber *documentID = nil;
NSError *error = nil;
BOOL result = [URL getResourceValue:&documentID forKey:NSURLDocumentIdentifierKey error:&error]; \
NSAssert(result == YES && error==nil, @"Unable to read property. Error: %@", error); \
NSLog(@"Processing file: %@", URL);
// This will break most of the times
NSAssert(documentID != nil, @"Document ID should not be nil!!");
}
也许我误解了文档,但在我看来 NSURLDocumentIdentifierKey 应该在磁盘上的每个文件上都可用。
【问题讨论】:
-
这里是否涉及沙盒?
-
我不这么认为:我根本没有使用沙盒。除非这是 MAS 独有的功能,但我不这么认为。
标签: objective-c macos cocoa filesystems osx-yosemite