2014-06-09 6 views
0

사용자 디스크의 어느 곳에서나 파일 목록을 가지고있는 OSX 애플리케이션이 있습니다.코어 데이터에 지속되는 북마크

첫 번째 버전의 응용 프로그램은 이러한 파일의 경로를 코어 데이터 모델에 저장합니다.

그러나 파일을 이동하거나 이름을 변경하면 도구의 용도가 사라지고 응용 프로그램이 중단 될 수 있습니다.

그래서 북마크를 사용하기로 결정했습니다. 그것은 작동하는 것,하지만 내가 데이터를 복구하려고 할 때마다, 나는 파일의 이전 경로를 얻을. 왜 그런가요? 내가 뭘 놓치고 있니?

내 핵심 데이터 엔티티는 이진 데이터 필드를 사용하여 책갈피를 유지합니다.

북마크 자체는 다음과 같이 이루어집니다 : 나는 경우

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 * bookmark = [filePath bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark 
         includingResourceValuesForKeys:NULL 
             relativeToURL:NULL 
               error:NULL]; 

을하고 응용 프로그램을로드에, 나는 모든 테이블을 반복하고이 같은 책갈피를 복구하는 루프를 가지고 파일의 이름을 변경하면 경로는 null입니다. 이 NSData 객체와 경로가있는 문자열을 저장하는 데 차이가 없음을 알 수 있습니다. 그래서 나는 분명히 뭔가를 놓치고 있습니다.

편집 : 종종 다음과 같은 오류가 발생합니다 : CFURLSetTemporaryResourcePropertyForKey failed because it was passed this URL which has no scheme.

감사합니다. 감사합니다.

답변

0

내 코드에서 문제를 찾을 수 없으므로 변경했습니다.

"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"); 
    } 
} 

그러나, 나는 내 앞의 코드가 실패한 이유를 아직도 궁금합니다. 나는 그것에 대한 어떤 생각이라도 고맙다. 감사!

관련 문제