2009-09-23 7 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 bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error]で生成されたブックマークデータを+[NSURL writeBookmarkData:toURL:options:error:]に渡します。ブックマークは、+[NSURL bookmarkDataWithContentsOfURL:error:]から返されたブックマークデータを+[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]が通過した後で解決できます。

OS X 10.6より前のバージョンでは、OS XファイルエイリアスシステムのCarbon-eraインターフェイスであるAliasManagerを使用して、同じ機能(ネットワークを認識していない点を除いて)を利用できます。エイリアスマネージャーの上にObjective-Cラッパーが2つあり、CocoaからCocoaを使用する方がはるかに優れています。私のお気に入りは、Wolf RentzschのChris HansonのBDAliasgithub)の追加です。

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

+0

これはサンドボックスでは機能しますか?または特別な権限を要求する必要がありますか? –

+0

あなたはGitHubに投稿したことを知っていますが、ここでは完全性のために残しておきます。私はそれがサンドボックスモード(https://github.com/ptrsghr/FileWatcher/pull/1#commits-pushed-02a521c)で動作するはずだと思います。あなたが問題に遭遇したら私に知らせてください。 – rgbrgb

関連する問題