2010-08-23 10 views
14

No soy muy competente en la programación de Mac OS X, pero estoy trabajando en una aplicación Qt que necesita información sobre los dispositivos de almacenamiento. Básicamente una lista de discos duros y memorias USB. El resultado final debe ser como un vector que contiene la siguiente información para cada dispositivo:¿Cómo se enumeran los volúmenes en Mac OS X?

cadena: Etiqueta
cadena: Punto de montaje
cadena: Descripción del equipo (nombre de alias amistoso)
uint64: Tamaño
bool : ¿Es extraíble?

Lo he estado haciendo en Windows y la siguiente publicación Get information about disk drives result on windows7 - 32 bit system me ha sido de gran ayuda. Sin embargo, aunque soy muy hábil en C/C++, no soy muy bueno en la programación de Mac OS X, Cocoa y/o Objective-C, por lo que cualquier ayuda sería muy apreciada.

Respuesta

14

Esto debe conseguir que la mayor parte de lo que usted está buscando (para información sobre un punto conocido montaje.):

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 para obtener más POO que mi respuesta. :) –

+0

Gracias. Esto hace exactamente lo que necesito :) No encontré una manera de mostrar la información como el 'Nombre descriptivo' en Windows, aunque supongo que hay una manera de hacerlo en una Mac (pensé que era el campo de descripción aquí , pero es un sistema de archivos). Si sabe cómo recuperar esa información, hágamelo saber ... de lo contrario, es increíble :) – Amy

+0

@emi: Hm, no sé. Ni siquiera puedo encontrar algo como esto usando el I/O Registry Explorer (ubicado en '/ Developer/Applications/Utilities'). –

4

Bueno, en el día que usamos FSGetVolumeInfo. En cuanto a la capacidad de remoción, sería FSGetVolumeParms usando vMExtendedAttributes & 1<< bIsRemovable. (En realidad, no recuerdo esa API en particular. Había algo llamado Driver Gestalt, pero ya no está).

Supongo que hay una brillante interfaz Objective-C, pero si nadie más responde, al menos está la C camino.

4

Tome un vistazo a getmntinfo() (para una enumeración de los puntos de montaje) y statfs()