Esistono un paio di modi diversi per elencare i volumi montati su OS X, ognuno dei quali utilizza un diverso set di API. Al livello più alto (e più semplice), puoi usare NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:
. Ecco un esempio abbreviato:
NSArray *urls = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:@[NSURLVolumeNameKey] options:0];
for (NSURL *url in urls) {
NSLog(@"Volume mounted at: %@", [url path]);
}
L'opzione successiva ci riporta al territorio C - ed eri così vicino al tuo approccio originale. Su OS X (e BSD), non c'è getmntent()
; Invece, c'è getmntinfo()
, che è sorprendentemente simile. Per elencare i volumi montati tramite getmntinfo()
, puoi fare quanto segue:
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);
}
Ho usato entrambe queste API fianco a fianco dal rilascio di 10.6. getmntinfo()
è sempre più completo di [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]
: quest'ultimo filtrerà il /dev
e altri filesystem che potresti voler conoscere. È generalmente affidabile, tuttavia, per i dischi che si collegano al sistema.
Lo scopo dietro il framework di discarbitrato è diverso, come hai notato. Il discarbitrato riguarda il monitoraggio e la gestione delle risorse del disco. Con DA, puoi essere chiamato ogni volta che un nuovo disco viene montato o non montato. Puoi anche gestire quei dischi rinominando, montando, slegando o espulndoli, oltre a inserirti nel processo di montaggio/Unmount - e potenzialmente sospendendo le richieste per fare lo stesso. Ma, come hai sottolineato, non fornisce un'interfaccia per elencare i dischi esistenti. Una volta che hai ottenuto la tua lista di volumi montati, DA è una fermata eccellente (a seconda, ovviamente, nel motivo per ottenere quella lista!).