Как проверить, защищена ли вставленная SD-карта от записи или нет в Qt?

Привет, друзья! Я работаю над приложением, в котором я должен проверить файловую систему SD-карты, а также мне нужно проверить, защищена ли вставленная SD-карта от записи или нет. Мне удалось получить детали файловой системы следующим образом:

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 gives me the path of the SD Card

// Get the file system details
if (GetVolumeInformation(
path,
volumeName,
ARRAYSIZE(volumeName),
&serialNumber,
&maxComponentLen,
&fileSystemFlags,
fileSystemName,
ARRAYSIZE(fileSystemName)))
{
newData.strFileSystem = QString::fromUtf16(fileSystemName);
}

m_SDInfoList.append(newData); // m_SDInfoList is QList

При таком подходе я узнаю, является ли файловая система FAT32 или NTFS. Теперь я хочу добиться защиты деталей от записи. Является ли их Qt API, который может дать мне понять, защищена ли вставленная SD-карта от записи ??? Пожалуйста помоги 🙂

Обновить:

Это то, что я сделал с помощью QFileInfo:

QFileInfo fileInfo(deviceData->m_strPath);

if(!fileInfo.isWritable())
{
newData.strStatus = "WriteProtect Enabled";
}
else
{
newData.strStatus = "WriteProtect Disabled";
}

Это всегда приводит к отключению WriteProtect, даже если я установил разрешение на запись.

0

Решение

Я подозреваю, что вы не можете сделать это с Qt. Вам нужно будет добавить собственный код для каждой целевой платформы.

Однако вы можете просто попытаться создать пустой файл и сразу же удалить его. Если при создании файла произойдет сбой, то том, скорее всего, доступен только для чтения (или ему не хватает свободного места, вам необходимо проверить коды ошибок).

2

Другие решения

Не уверен, как это сделать в QT, но WinAPI предоставляет вам GetVolumeInformation (http://pinvoke.net/default.aspx/kernel32/GetVolumeInformation.html) метод (позволяет проверить, защищен ли диск от записи или нет), который возвращает следующий флаг:

/// <summary>
/// The specified volume is read-only.
/// </summary>
ReadOnlyVolume = 0x80000,
0

По вопросам рекламы [email protected]