2009-09-23 34 views
14

我有一個Cocoa應用程序,它在用戶的計算機上存儲對多媒體文件(圖像,視頻等)的引用。我想知道是否有一種方法可以獲得對該文件的引用,即使用文件路徑,以便如果用戶將該文件移動到其計算機上的其他文件夾,我仍然會知道它在哪裏。我目前存儲的文件路徑的陣列被從標準可可公開對話傳遞迴:在移入objective-c後保留對文件的引用?

-(void)addMultimediaDidEnd:(NSOpenPanel*)sheet 
      returnCode:(int)returnCode 
      contextInfo:(NSString *)contextInfo 
{ 
    if(returnCode == NSOKButton) { 
     [sheet orderOut:nil]; 
     [self saveFiles:[sheet filenames]]; 
    } 
} 

回答

18

在OS X 10.6(Snow Leopard)上,一個NSURL可以被轉換成文件引用URL(使用-[NSURL fileReferenceURL] )當您的應用程序正在運行時,它通過移動引用文件。如果要保留此文件參考,請使用+[NSURL writeBookmarkData:toURL:options:error:]傳遞使用-[NSURL bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error]生成的書籤數據。稍後可以通過+[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]傳遞從+[NSURL bookmarkDataWithContentsOfURL:error:]返回的書籤數據來解析書籤。

在OS X 10.6之前,可以通過AliasManager(OS X文件別名系統的Carbon時代界面)獲得相同的功能(減去一些網絡感知細節)。在Alias Manager的頂部有幾個Objective-C包裝器,它使得Cocoa可以更好地使用它。我最喜歡的是Wolf Rentzsch對Chris Hanson的BDAlias(可在github上獲得)的補充。

9

下面是使用書籤跨移動跟蹤文件的一個簡單的例子:

- (NSData *)bookmarkFromURL:(NSURL *)url { 
    NSData *bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark 
        includingResourceValuesForKeys:NULL 
             relativeToURL:NULL 
               error:NULL]; 
    return bookmark; 
} 

- (NSURL *)urlFromBookmark:(NSData *)bookmark { 
    NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark 
              options:NSURLBookmarkResolutionWithoutUI 
            relativeToURL:NULL 
           bookmarkDataIsStale:NO 
              error:NULL]; 
    return url; 
} 

https://github.com/ptrsghr/FileWatcher/blob/master/FileWatcherExample/Classes/FileWatcher.m

+0

感謝您的例子! – Austin 2011-03-09 15:41:51

+0

在沙箱中完成這項工作嗎?還是我必須要求特別的權限? – 2012-11-19 18:59:15

+0

我知道你發佈在GitHub上,但爲了完整起見,我將在此處予以說明。我相信它應該在沙盒模式下工作(https://github.com/ptrsghr/FileWatcher/pull/1#commits-pushed-02a521c)。如果遇到任何問題,請告知我。 – rgbrgb 2012-11-24 18:08:05

相關問題