[英]Persisting bookmark in core-data
我有一個OSX應用程序,該應用程序應該具有用戶磁盤中任何位置的文件列表。
該應用程序的第一個版本將這些文件的路徑保存在核心數據模型中。
但是,如果文件被移動或重命名,該工具將失去其用途,並且應用程序可能會崩潰。
因此,我決定使用書簽。 它似乎正在工作,但是每次我嘗試恢復數據時,都會得到文件的舊路徑。 這是為什么? 我想念什么?
我的核心數據實體使用二進制數據字段來保留書簽。
書簽本身是這樣完成的:
NSData * bookmark = [filePath bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark
includingResourceValuesForKeys:NULL
relativeToURL:NULL
error:NULL];
在加載應用程序時,我有一個循環來迭代所有表並像這樣恢復書簽:
while (object = [rowEnumerator nextObject]) {
NSError * error = noErr;
NSURL * bookmark = [NSURL URLByResolvingBookmarkData:[object fileBookmark]
options:NSURLBookmarkResolutionWithoutUI
relativeToURL:NULL
bookmarkDataIsStale:NO
error:&error];
if (error != noErr)
DDLogCError(@"%@", [error description]);
DDLogCInfo(@"File Path: %@", [bookmark fileReferenceURL]);
}
如果我重命名文件,則路徑為空。 我看到存儲此NSData對象和帶有路徑的字符串之間沒有區別。 所以我很明顯地缺少一些東西。
編輯:我也經常會收到這樣的錯誤: CFURLSetTemporaryResourcePropertyForKey failed because it was passed this URL which has no scheme
。
感謝您的幫助,謝謝!
我在代碼中找不到任何問題,因此我進行了更改。
在找到“ no scheme”消息的原因之后,我得出結論,該代碼需要一些第三方應用程序才能工作,這是不可取的。
我現在正在使用別名。 這是我創建它們的方式:
FSRef fsFile, fsOriginal;
AliasHandle aliasHandle;
NSString * fileOriginalPath = [[filePath absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
OSStatus status = FSPathMakeRef((unsigned char*)[fileOriginalPath cStringUsingEncoding: NSUTF8StringEncoding], &fsOriginal, NULL);
status = FSPathMakeRef((unsigned char*)[fileOriginalPath cStringUsingEncoding: NSUTF8StringEncoding], &fsFile, NULL);
OSErr err = FSNewAlias(&fsOriginal, &fsFile, &aliasHandle);
NSData * aliasData = [NSData dataWithBytes: *aliasHandle length: GetAliasSize(aliasHandle)];
現在,我恢復了這樣的路徑:
while (object = [rowEnumerator nextObject]) {
NSData * aliasData = [object fileBookmark];
NSUInteger aliasLen = [aliasData length];
if (aliasLen > 0) {
FSRef fsFile, fsOriginal;
AliasHandle aliasHandle;
OSErr err = PtrToHand([aliasData bytes], (Handle*)&aliasHandle, aliasLen);
Boolean changed;
err = FSResolveAlias(&fsOriginal, aliasHandle, &fsFile, &changed);
if (err == noErr) {
char pathC[2*1024];
OSStatus status = FSRefMakePath(&fsFile, (UInt8*) &pathC, sizeof(pathC));
NSAssert(status == 0, @"FSRefMakePath failed");
NSLog(@"%@", [NSString stringWithCString: pathC encoding: NSUTF8StringEncoding]);
} else {
NSLog(@"The file disappeared!");
}
} else {
NSLog(@"CardCollectionUserDefault was zero length");
}
}
但是,我仍然對為什么以前的代碼失敗感到好奇。 我對此表示感謝。 謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.