2009-09-23 4 views
14

Ich habe eine Cocoa-Anwendung, die einen Verweis auf Multimedia-Dateien (Bilder, Videos usw.) auf dem Computer des Benutzers speichert. Ich frage mich, ob es eine Möglichkeit gibt, einen Verweis auf diese Datei zu erhalten, die einen Dateipfad verwendet, so dass ich, wenn der Benutzer diese Datei in einen anderen Ordner auf ihrem Computer verschiebt, immer noch weiß, wo er ist. Ich bin derzeit das Array von Dateipfaden zu speichern, die wieder aus dem Standard-Cocoa offenen Dialog geführt werden:Behalten Sie einen Verweis auf eine Datei, nachdem sie in Ziel-c verschoben wurde?

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

Antwort

18

In OS X 10.6 (Snow Leopard) kann ein NSURL in eine Datei Referenz-URL umgewandelt wird (mit -[NSURL fileReferenceURL]), die während der Ausführung Ihrer Anwendung eine Datei über Bewegungen hinweg referenziert. Wenn Sie diese Dateireferenz beibehalten möchten, verwenden Sie +[NSURL writeBookmarkData:toURL:options:error:], um die mit -[NSURL bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error] generierten Lesezeichendaten zu übergeben. Das Lesezeichen kann später mit +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:] aufgelöst werden, indem es die von +[NSURL bookmarkDataWithContentsOfURL:error:] zurückgegebenen Bookmark-Daten weiterleitet.

Vor OS X 10.6 ist die gleiche Funktionalität (abzüglich einiger netzwerkfähiger Nettigkeiten) über den AliasManager verfügbar, eine Carbon-Ära-Schnittstelle zum OS X-Dateialiassystem. Es gibt ein paar Objective-C-Wrapper über dem Alias-Manager, die die Verwendung von Cocoa wesentlich angenehmer machen. Mein Favorit ist Wolf Rentzschs Ergänzungen zu Chris Hansons BDAlias (erhältlich unter github).

9

Hier ist ein kurzes Beispiel Lesezeichen der Verwendung von Dateien über Bewegungen zu verfolgen:

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

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

+0

Danke für das Beispiel! – Austin

+0

funktioniert das in Sandbox? Oder muss ich um spezielle Berechtigungen bitten? –

+0

Ich weiß, dass Sie auf GitHub gepostet haben, aber ich werde das hier der Vollständigkeit halber lassen. Ich glaube, es sollte im Sandbox-Modus funktionieren (https://github.com/ptrsghr/FileWatcher/pull/1#commits-pushed-02a521c). Lassen Sie es mich wissen, wenn Sie auf Probleme stoßen. – rgbrgb

Verwandte Themen