Как перечислить объемы в Mac OS X?

Я не очень разбираюсь в программировании на Mac OS X, но я работаю над Qt-приложением, которое нуждается в информации об устройствах хранения. В основном список жестких дисков и флэш-накопителей USB. Конечный результат должен быть как вектор, который содержит следующую информацию для каждого устройства:

string: Label

строка: точка монтирования
string: описание устройства (иначе называемое дружественное имя)
uint64: Размер
bool: Съемный?

Я делаю это в Windows и следующее сообщение Получаем информацию о результате работы с дисками на Windows7 - 32-битной системе. Однако, хотя я очень хорошо разбираюсь в C/С++, я не очень хорошо разбираюсь в программировании на Mac OS X, Cocoa и/или Objective-C, поэтому любая помощь будет высоко оценена.

Ответ 1

Это поможет вам больше всего того, что вы ищете:

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);
}

Ответ 2

Взгляните на getmntinfo() (для перечисления точек монтирования) и statfs() (для информации о известной точке монтирования.)

Ответ 3

Хорошо, в тот же день мы использовали FSGetVolumeInfo. Что касается удаления, это будет FSGetVolumeParms с помощью vMExtendedAttributes & 1<< bIsRemovable. (На самом деле, я не помню этот API. Было что-то, называемое Driver Gestalt, но оно исчезло.)

Я предполагаю, что есть блестящий интерфейс Objective-C, но если никто не отвечает, по крайней мере там есть способ C.