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!).