Привет, друзья! Я работаю над приложением, в котором я должен проверить файловую систему 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, даже если я установил разрешение на запись.
Я подозреваю, что вы не можете сделать это с Qt. Вам нужно будет добавить собственный код для каждой целевой платформы.
Однако вы можете просто попытаться создать пустой файл и сразу же удалить его. Если при создании файла произойдет сбой, то том, скорее всего, доступен только для чтения (или ему не хватает свободного места, вам необходимо проверить коды ошибок).
Не уверен, как это сделать в QT, но WinAPI предоставляет вам GetVolumeInformation (http://pinvoke.net/default.aspx/kernel32/GetVolumeInformation.html) метод (позволяет проверить, защищен ли диск от записи или нет), который возвращает следующий флаг:
/// <summary>
/// The specified volume is read-only.
/// </summary>
ReadOnlyVolume = 0x80000,