2008-11-27 6 views
1

Y a-t-il un moyen de monter un dossier sur le disque dur en tant que périphérique dans le Finder. L'intention ici est de fournir à l'utilisateur un moyen facile d'accéder à un dossier que mon application utilise pour stocker des données. Je ne souhaite pas que mon utilisateur recherche des données dans Application Data. Je préférerais leur permettre de rendre ces données disponibles en tant que volume monté ou dispositif dans le Finder. Je voudrais également que ce volume ou périphérique soit en lecture/écriture, de sorte que si l'utilisateur apporte des modifications aux fichiers de données, les modifications seront reflétées dans le dossier d'origine. Y a-t-il un moyen de le faire dans le cacao, le carbone ou l'applescript?Montage d'un dossier en tant que périphérique dans le Finder à l'aide de Cocoa

Répondre

4

Essayez de regarder dans FUSE. Vous pouvez avoir toutes sortes de systèmes de fichiers psuedo avec ça.

Mais je vous met un peu en garde contre ce que vous essayez de faire. Il peut être plus logique d'avoir un bouton qui ouvre le dossier dans votre application, plutôt que de créer un nouveau périphérique. Personnellement, je trouverais difficile de continuer à utiliser une application qui fait une telle chose. Cela ne correspond pas vraiment au reste des applications disponibles.

Vous pouvez également utiliser un alias pour désigner votre répertoire de données d'application.

0

Je voudrais également faire preuve de prudence avec cela, semble potentiellement un peu déroutant pour la plupart des utilisateurs. Cela dit, avez-vous envisagé simplement de créer un lien symbolique vers le répertoire en question?

1

Vous pouvez utiliser une image de disque fragmentée pour créer un lecteur «faux».

Mais pourquoi ne pas configurer le répertoire de données dans votre application? Ou utilisez le sous-répertoire dans ~/Documents/?

Alias ​​/ symlink sur le bureau sera la solution la plus simple:

ln -s '~/Application Data/Yourapp' '~/Desktop/Yourapp Data' 
1

puis-je suggérer de réviser ce tout? Un lien symbolique ou un alias fonctionnerait, mais, si possible, une meilleure idée serait d'enregistrer les types de fichiers que les personnes vont déplacer dans ce dossier, puis de répondre à leur ouverture en les déplaçant ou en les copiant dans le bon dossier. Je pense à quelque chose comme l'interface Dashboard, où si vous double-cliquez sur un fichier .wdgt téléchargé, il vous demande si vous voulez 'installer' le widget et, si vous le faites, le copie dans ~/Library/Widgets. Évidemment, si vous traitez avec des types communs comme les images, les dossiers, ou les fichiers de texte génériques, ceci peut être impraticable.

Pour l'implémentation, vous devez simplement ajouter les types de document à votre Info.plist et les gérer dans votre application-Delegator: openFile: method.

0

I Faites-le en utilisant NSWorkspace. Dans mon cas, je fais une vérification initiale avec la fonction - (BOOL) isMountedPath;

Le code de montage est la suivante:

NSURL *path=[NSURL URLWithString:@"smb://server.resource/KEYS_DB"]; 
    if(NO==[self isMountedPath:[path absoluteString]]) 
    { 
     NSWorkspace *ws=[NSWorkspace sharedWorkspace]; 
     [ws openURL:path]; 
    } 

Le code pour vérifier si un trajet est monté est:

-(BOOL)isMountedPath:(NSString *)share 
{ 
    NSArray * keys = @[NSURLVolumeURLForRemountingKey]; 
    NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0]; 

    NSError * error; 
    NSURL * remount; 

    for (NSURL * mountPath in mountPaths) { 
     [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error]; 
     if(remount){ 
      if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]]) 
      { 
       printf("Already mounted at %s\n", [[mountPath path] UTF8String]); 
       return YES; 
      } 
     } 
    } 
    return NO; 
} 

Autre méthode possible est utile:

-(NSString *)mountedPath:(NSString *)share 
{ 
    NSArray * keys = @[NSURLVolumeURLForRemountingKey]; 
    NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0]; 

    NSError * error; 
    NSURL * remount; 

    for (NSURL * mountPath in mountPaths) { 
     [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error]; 
     if(remount){ 
      if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]]) 
      { 
       printf("Already mounted at %s\n", [[mountPath path] UTF8String]); 
       return [mountPath path]; 
      } 
     } 
    } 
    return nil; 
}