2010-08-23 11 views
14

Ich bin nicht sehr gut in Mac OS X Programmierung, aber ich arbeite an einer Qt-Anwendung, die Informationen über die Speichergeräte benötigt. Im Grunde eine Liste von Festplatten und USB-Sticks. Das Endergebnis sollte wie ein Vektor sein, der die folgenden Informationen für jedes Gerät enthält:Wie listen Sie Volumes unter Mac OS X auf?

Zeichenfolge: Label
string: Mountpunkt
string: Gerätebeschreibung (auch bekannt als angezeigte Name)
uint64: Größe
bool : Ist abnehmbar?

Ich habe es unter Windows getan und der folgende Beitrag Get information about disk drives result on windows7 - 32 bit system war eine große Hilfe. Obwohl ich in C/C++ sehr gut bin, bin ich nicht wirklich gut in Mac OS X Programmierung, Cocoa und/oder Objective-C, so würde jede Hilfe sehr geschätzt werden.

Antwort

14

Dies sollte Sie am meisten von dem, was Sie suchen (für Informationen über ein bekannt Mount-Punkt.):

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 für mehr OOPness als meine Antwort. :) –

+0

Danke. Das macht genau das, was ich brauche :) Ich habe keine Möglichkeit gefunden, Informationen wie den 'Friendly Name' auf Windows anzuzeigen, obwohl ich denke, dass es einen Weg gibt, es auf einem Mac zu machen (ich dachte, es ist das Beschreibungsfeld hier , aber es ist ein Dateisystem). Wenn Sie wissen, wie Sie diese Informationen abrufen, lassen Sie es mich wissen ... sonst ist es genial :) – Amy

+0

@emi: Hm, ich weiß es nicht. Ich kann nicht einmal so etwas mit dem I/O Registry Explorer finden (unter '/ Developer/Applications/Utilities'). –

4

Nun, damals haben wir FSGetVolumeInfo verwendet. Was die Entfernbarkeit betrifft, wäre dies FSGetVolumeParms unter Verwendung von vMExtendedAttributes & 1<< bIsRemovable. (Eigentlich erinnere ich mich nicht an diese bestimmte API. Es gab etwas namens Driver Gestalt, aber es ist jetzt weg.)

Ich nehme an, es gibt eine glänzende Objective-C-Schnittstelle, aber wenn niemand anderes antwortet, gibt es zumindest die C Weg.

4

Werfen Sie einen Blick auf getmntinfo() (für eine Aufzählung von Mount-Punkte) und statfs()