Question

Je suis intéressé à itération de tous les systèmes de fichiers montés sur OSX (exécutant actuellement 10.9 Mavericks). Je recherche quelque chose de similaire à getmntent () ou la sortie de la commande de shell Mount (bien que je veuille le faire à partir de l'objectif C, donc l'analyse de la sortie d'une commande shell n'est évidemment pas optimale).

J'ai regardé un peu le cadre d'arbitrage du disque, et il semble que je pourrais être informé des événements de montage et de non-retour en utilisant ce cadre. Je manque peut-être quelque chose là-bas, mais il n'est pas clair pour moi s'il existe un moyen d'itérer les systèmes de fichiers montés existants en utilisant l'arbitrage du disque.

J'ai exploré à l'aide de getFENT () qui semblait fournir une solution, mais après avoir testé, j'ai découvert que je n'obtiens pas plus d'une entrée d'Iterating GetFsent (). Voir le code suivant:

struct fstab* fsentry;
setfsent();
fsentry = getfsent();
while(fsentry)
{
    //do something with fsentry
    fsentry = getfsent();
}
endfsent();

La seule entrée que j'obtiens ici est pour le système de fichiers. La deuxième fois que j'appelle getfsent (), il renvoie null, comme s'il n'y avait plus d'entrées. La commande Mount me montre plusieurs autres, dont un système de fichiers CIFS / SMB monté:

/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
//user@<ip address>/public on /Volumes/public (smbfs, nodev, nosuid, mounted by user)

Il semble donc que getFsent () commence à faire ce que j'attends, mais pour une raison quelconque, s'arrête?

Ma question en résumé est: quelle est la meilleure façon d'itérer les systèmes de fichiers sur OSX?

Si quelqu'un a une réponse à la raison pour laquelle je n'obtiens qu'un résultat de getFsent (), j'y serais également intéressé.

Était-ce utile?

La solution

Il existe de différentes façons d'énumérer les volumes montés sur OS X, chacun en utilisant différents ensembles d'API. Au niveau le plus élevé (et le plus simple), vous pouvez utiliser NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:. Voici un exemple abrégé:

NSArray *urls = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:@[NSURLVolumeNameKey] options:0];
for (NSURL *url in urls) {
  NSLog(@"Volume mounted at: %@", [url path]);
}

La prochaine option nous ramène sur le territoire C - et vous étiez si proche de votre approche originale. Sur OS X (et BSD), il n'y a pas getmntent(); Au lieu de cela, il y a getmntinfo(), ce qui est étonnamment similaire. Pour indiquer les volumes montés via getmntinfo(), vous pouvez faire ce qui suit:

struct statfs* mounts;
int num_mounts = getmntinfo(&mounts, MNT_WAIT);
if (num_mounts < 0) {
  // do something with the error
}

for (int i = 0; i < num_mounts; i++) {
  NSLog(@"Disk type '%s' mounted at: %s", mounts[i].f_fstypename, mounts[i].f_mntonname);
}

J'ai utilisé ces deux API côte à côte depuis la sortie de 10.6. getmntinfo() est toujours plus complet que [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]: ce dernier filtrera le /dev et d'autres systèmes de fichiers que vous pouvez savoir ou non. Il est généralement fiable, cependant, pour les disques que vous branchez sur votre système.

Le but derrière le cadre de diskarbitration est différent, comme vous l'avez remarqué. La disque de disque consiste à surveiller et à gérer les actifs disque. Avec DA, vous pouvez être appelé chaque fois qu'un nouveau disque est monté ou non monté. Vous pouvez également gérer ces disques en renommant, en montant, en les non-la ouvrant ou en les éjectant, ainsi qu'en vous insérant dans le processus Mount / Mount - et potentiellement suspendre les demandes de faire de même. Mais, comme vous l'avez souligné, il ne fournit pas d'interface pour répertorier les disques existants. Une fois que vous obtenez votre liste de volumes montés, DA est un excellent prochain arrêt (selon, bien sûr, sur votre raison d'obtenir cette liste!).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top