Hay un par de formas diferentes de enumerar los volúmenes montados en OS X, cada uno con un conjunto diferente de API. En el nivel más alto (y más fácil), puede usar NSFilemanager's mountedVolumeURLsIncludingResourceValuesForKeys:options:
. Aquí hay un ejemplo abreviado:
NSArray *urls = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:@[NSURLVolumeNameKey] options:0];
for (NSURL *url in urls) {
NSLog(@"Volume mounted at: %@", [url path]);
}
La siguiente opción nos lleva de regreso al territorio C, y estabas muy cerca con tu enfoque original. En OS X (y BSD), no hay getmntent()
; en cambio, hay getmntinfo()
, que es sorprendentemente similar. Para enumerar volúmenes montados a través de getmntinfo()
, puedes hacer lo siguiente:
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);
}
He usado estas dos API de lado a lado desde el lanzamiento de 10.6. getmntinfo()
siempre es más completo que [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]
: este último filtrará el /dev
y otros sistemas de archivos que puede o no querer saber. Sin embargo, es generalmente confiable para los discos que se conecta a su sistema.
El propósito detrás del marco de diskarbitration es diferente, como usted notó. Diskarbitration se trata de monitorear y administrar activos de disco. Con DA, puede ser llamado cada vez que se monte o se desmonte un nuevo disco. También puede administrar esos discos renombrando, montando, desmontándose o expulsándolos, además de insertarse en el proceso de montaje/desmontaje, y posiblemente suspendiendo las solicitudes para hacer lo mismo. Pero, como señaló, no proporciona una interfaz para enumerar los discos existentes. Una vez que obtenga su lista de volúmenes montados, DA es una excelente parada (dependiendo, por supuesto, en su razón para obtener esa lista!).