Как получить формат файла диска в MAC OS в приложении Qt?

Я работаю над приложением, в котором мне нужно проверить формат файла диска/SD-карты (FAT 32/NTFS и т. д.) и отобразить его. Это приложение основано на Qt, которое я должен запускать как на MAC, так и на Windows. Нет Qt Api, который мог бы позволить мне добиться результата, поэтому я выбрал только этот подход.

Вот как я добился этого в Windows:

TCHAR volumeName[MAX_PATH + 1] = { 0 };
TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
DWORD serialNumber = 0;
DWORD maxComponentLen = 0;
DWORD fileSystemFlags = 0;

LPCWSTR path = deviceData->m_strPath.utf16(); //deviceData->m_strpath gives me the drive path

if (GetVolumeInformation(
    path,
    volumeName,
    ARRAYSIZE(volumeName),
    &serialNumber,
    &maxComponentLen,
    &fileSystemFlags,
    fileSystemName,
    ARRAYSIZE(fileSystemName)))
{
         newData.strFileSystem = QString::fromUtf16(fileSystemName);
}   

    QList m_SDInfoList;
    m_SDInfoList.append(newData);

Меня беспокоит то, что я не могу найти MAC API, который может предоставить мне информацию о формате файла, когда я подключаю тот же диск / SD-карту к машине MAC. Пожалуйста помоги :)


person Gojira    schedule 29.04.2013    source источник


Ответы (1)


У меня были похожие проблемы с поиском эквивалентов OSX для нескольких методов winapi. И то, что я нашел самым быстрым решением для реализации, — это использование утилит командной строки на osx через QProcess. Вероятно, это намного медленнее, чем любой вызов API, но если вы используете его нечасто, все должно быть в порядке.

Например:

diskutil info /dev/disk0s2

дает следующий вывод

(...)
Partition Type:           Apple_HFS
(...)

который вы можете прочитать из вывода QProcess.

QProcess p;
p.start("diskutil",QStringList() << "info" "/path/to/dev");
p.waitForFinished();
foreach(QString line, QString(p.readAll()).split("\n"))
   if(line.contains("Partition Type:"))
       qDebug() << line

Что-то вроде этого должно работать.

person Kimmeh    schedule 29.04.2013
comment
Боулз Сорхус: Спасибо за ответ. Я не работал на Mac, поэтому я немного не в курсе. Я хочу знать, почему вы передали /path/to/dev.... Если вы указываете путь к диску, тогда deviceData->m_strpath в моем коде даст путь к диску. А может быть, вы указываете на что-то другое :) - person Gojira; 29.04.2013
comment
/path/to/dev = /dev/disk0s2 в моем случае. Например, я только что смонтировал образ xcode Hardware IO Tools в /Volumes/Hardware IO Tools. тогда я мог бы использовать df | grep Hardware, чтобы найти устройство, которое является /dev/disk3s2, а затем использовать его в diskutil info /dev/disk3s2, которое произвело нужный мне вывод - person Kimmeh; 29.04.2013