2010-08-23 22 views
14

Non sono molto esperto in programmazione Mac OS X, ma sto lavorando a un'applicazione Qt che richiede informazioni sui dispositivi di archiviazione. Fondamentalmente un elenco di dischi rigidi e chiavette USB. Il risultato finale dovrebbe essere come un vettore che contiene le seguenti informazioni per ogni dispositivo:Come enumerare i volumi su Mac OS X?

stringa: Label
stringa: Punto di montaggio
stringa: descrizione del dispositivo (nome alias amichevole)
uint64: Dimensioni
bool : È rimovibile?

L'ho fatto su Windows e il seguente post Get information about disk drives result on windows7 - 32 bit system è stato di grande aiuto. Tuttavia, anche se sono molto abile in C/C++, non sono molto bravo nella programmazione Mac OS X, Cocoa e/o Objective-C, quindi qualsiasi aiuto sarebbe molto apprezzato.

risposta

14

Questo dovrebbe ottenere la maggior parte di quello che stai cercando (per informazioni su un noto punto di montaggio.):

NSWorkspace *ws = [NSWorkspace sharedWorkspace]; 
NSArray  *vols = [ws mountedLocalVolumePaths]; 
NSFileManager *fm = [NSFileManager defaultManager]; 

for (NSString *path in vols) 
{ 
    NSDictionary* fsAttributes; 
    NSString *description, *type, *name; 
    BOOL removable, writable, unmountable, res; 
    NSNumber *size; 

    res = [ws getFileSystemInfoForPath:path 
          isRemovable:&removable 
          isWritable:&writable 
         isUnmountable:&unmountable 
          description:&description 
            type:&type]; 
    if (!res) continue; 
    fsAttributes = [fm fileSystemAttributesAtPath:path]; 
    name   = [fm displayNameAtPath:path]; 
    size   = [fsAttributes objectForKey:NSFileSystemSize]; 

    NSLog(@"path=%@\nname=%@\nremovable=%d\nwritable=%d\nunmountable=%d\n" 
      "description=%@\ntype=%@, size=%@\n\n", 
      path, name, removable, writable, unmountable, description, type, size); 
} 
+0

+1 per più OOPness della mia risposta. :) –

+0

Grazie. Questo fa esattamente quello di cui ho bisogno :) Non ho trovato un modo per visualizzare le informazioni come il 'Friendly Name' su Windows, anche se suppongo che ci sia un modo per farlo su un Mac (ho pensato che fosse qui il campo della descrizione , ma è un filesystem). Se sai come recuperare queste informazioni, per favore fammi sapere ... altrimenti è fantastico :) – Amy

+0

@emi: Hm, non lo so. Non riesco nemmeno a trovare nulla di simile usando l'I/O Registry Explorer (che si trova in '/ Developer/Applications/Utilities'). –

4

Bene, nel giorno in cui abbiamo utilizzato FSGetVolumeInfo. Per quanto riguarda la rimovibilità, sarebbe FSGetVolumeParms utilizzando vMExtendedAttributes & 1<< bIsRemovable. (In realtà, non ricordo quella particolare API. C'era qualcosa chiamato Driver Gestalt, ma non c'è più.)

Suppongo che ci sia una lucida interfaccia Objective-C, ma se nessun altro risponde, almeno c'è la C modo.

4

Date un'occhiata a getmntinfo() (per un'enumerazione di punti di montaggio) e statfs()