2009-09-23 5 views
14

J'ai une application Cocoa qui stocke une référence à des fichiers multimédias (images, vidéos, etc.) sur l'ordinateur de l'utilisateur. Je me demande s'il existe un moyen d'obtenir une référence à ce fichier autre que l'utilisation d'un chemin de fichier de sorte que si l'utilisateur déplace ce fichier dans un dossier différent sur leur ordinateur, je saurais quand même où il se trouve. Je stocke actuellement l'ensemble des chemins de fichiers qui sont passés de retour du cacao dialogue standard ouvert:Conserver une référence à un fichier après son déplacement dans objective-c?

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

Répondre

18

Dans OS X 10.6 (Snow Leopard), un NSURL peut être converti en une URL de référence de fichier (en utilisant -[NSURL fileReferenceURL]) qui référence un fichier à travers les mouvements pendant que votre application est en cours d'exécution. Si vous souhaitez conserver cette référence de fichier, utilisez +[NSURL writeBookmarkData:toURL:options:error:] en transmettant les données de signet générées avec -[NSURL bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error]. Le signet peut être résolu plus tard avec +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:] en passant les données de signet renvoyées par +[NSURL bookmarkDataWithContentsOfURL:error:].

Avant la version OS X 10.6, la même fonctionnalité (moins certaines subtilités sensibles au réseau) est disponible via AliasManager, une interface de l'ère Carbon du système d'alias de fichiers OS X. Il y a deux wrappers Objective-C sur le gestionnaire d'alias qui rendent l'utilisation de Cocoa beaucoup plus agréable. Mon préféré est les ajouts de Wolf Rentzsch à BDAlias de Chris Hanson (disponible sur github).

9

Voici un exemple rapide de l'utilisation de signets pour suivre des fichiers sur mouvements:

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

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

+0

Merci pour l'exemple! – Austin

+0

cela fonctionne-t-il dans le bac à sable? Ou dois-je demander des autorisations spéciales? –

+0

Je sais que vous avez posté sur GitHub mais je vais laisser ceci ici pour l'exhaustivité. Je crois que cela devrait fonctionner en mode bac à sable (https://github.com/ptrsghr/FileWatcher/pull/1#commits-pushed-02a521c). Faites-moi savoir si vous rencontrez des problèmes. – rgbrgb

Questions connexes