Domanda

Sono interessato a ripetere tutti i file system montati su OSX (attualmente in esecuzione 10.9 Mavericks). Sto cercando qualcosa di simile a getMntent () o l'output del comando Monte Shell (anche se voglio farlo dall'obiettivo C, quindi analizzare l'output di un comando shell non è ovviamente ottimale).

Ho guardato un po 'il framework di arbitrato su disco e sembra che io possa essere avvisato sugli eventi di montaggio e sconosciuto usando questo framework. Potrei perdere qualcosa lì, ma non mi è chiaro se c'è un modo per iterare i file system montati esistenti usando l'arbitrato del disco.

Ho esplorato usando getfsent () che sembrava fornire una soluzione, ma dopo il test ho scoperto che non sto ricevendo più di una voce da iterating getfsent (). Vedi il seguente codice:

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

L'unica voce che ricevo qui è per il / file system. La seconda volta che chiamo getfsent () restituisce null, come se non ci fossero più voci. Il comando Monte mi mostra molti altri tra cui un file system montato CIFS/SMB:

/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)

Quindi sembra che getFsent () inizi a fare quello che mi aspetto, ma per qualche motivo si ferma?

La mia domanda in sintesi è: qual è il modo migliore per iterare i file system su OSX?

Se qualcuno ha una risposta al motivo per cui ricevo solo un risultato da GetFsent (), sarei interessato anche a questo.

È stato utile?

Soluzione

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top