2010-01-09 2 views
3

Je souhaite trouver le point de montage d'un volume pour un chemin NSString donné.objectif cacao-c pour os x: obtention du point de montage du volume à partir du chemin

Bien que je sois un débutant dans Cocoa et objectif-C, j'essaye de le faire "élégamment", c'est à dire. en utilisant un de la classe fournie, plutôt que de faire un appel de shell externe ou de répertorier les systèmes de fichiers montés et de trouver celui auquel le chemin appartient.

J'ai trouvé NSWorkspace et getFileSystemInfoForPath, mais il ne mentionne pas le point de montage.

Quelqu'un peut-il aider?

grâce

+0

Chemin vers quoi? Un fichier sur le volume, l'appareil sauvegardant le volume, ou autre chose? –

+0

un chemin vers un fichier sur le volume –

+1

Je ne pense pas qu'il existe une méthode Cocoa pour cela. Dans quel but avez-vous besoin du point de montage? La solution dépendrait de cela. Par exemple, le point de montage changera si le nom du volume est modifié à partir du Finder; Voulez-vous le nom de volume, ou quelque chose d'unique à l'appareil, indépendant du nom de volume qu'un utilisateur lui assigne? – Yuji

Répondre

4

Cela devrait aller quelque chose le long de ces lignes:

+ (NSString*)volumeNameForPath:(NSString *)inPath 
{ 
    HFSUniStr255 volumeName; 
    FSRef volumeFSRef; 
    unsigned int volumeIndex = 1; 

    while (FSGetVolumeInfo(kFSInvalidVolumeRefNum, volumeIndex++, NULL, kFSVolInfoNone, NULL, &volumeName, &volumeFSRef) == noErr) { 
     NSURL *url = [(NSURL *)CFURLCreateFromFSRef(NULL, &volumeFSRef) autorelease]; 
     NSString *path = [url path]; 

     if ([inPath hasPrefix:path]) { 
      return [NSString stringWithCharacters:volumeName.unicode length:volumeName.length] 
     } 
    } 

    return nil; 
} 
+1

Cas d'échec: Deux volumes existent, "Volume avec un nom long" et "Volume". Le chemin d'entrée est "/ Volumes/Volume avec un nom long/un fichier", et la boucle arrive à "/ Volumes/Volume" en premier. Votre méthode renvoie "/ Volumes/Volume", ce qui est le mauvais. –

+0

merci pour la proposition. Mais j'ai aussi découvert un problème avec ça. Si j'utilise le chemin /Volumes/NO NAME/un/dir/in/bootcamp le volume renvoyé est le nom de la partition os x. J'espérais qu'il existait un moyen de trouver cette information, plutôt que de recourir à la manipulation de chaînes pour deviner le volume. –

+0

Il s'agit d'un code non testé que je n'ai même pas essayé de compiler. Des erreurs et des cas de bords sont à prévoir. Il dérive du code que j'ai écrit pour l'analyseur Aperture dans le navigateur iMedia. Là, j'ai le nom du volume stocké par Aperture et j'ai besoin de trouver le chemin complet. Je suppose que le cas de défaillance pourrait être résolu en s'assurant que la chaîne de chemin se termine par un /. –

1

J'ai couru par ce un mois après qu'il a été demandé, mais de toute façon: dans la bibliothèque standard de Python il n'y a os.path.ismount() fonction, détecte si un chemin est un point de montage. Depuis sa description, il fait en sorte:

La fonction vérifie si le parent de path, path/.., se trouve sur un dispositif différent de celui path, ou si path/.. et path pointent vers le même i-noeud sur le même appareil - cela devrait détecter les points de montage pour toutes les variantes Unix et POSIX.

Questions connexes