- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在使用 GetVolumeInformation()
报告的 FILE_READ_ONLY_VOLUME
文件系统标志检查 SD 卡是否被锁定时,我得到了一些奇怪的结果.
如果 SD 卡被锁定,并且 SD 卡包含一个带有文件系统的卷,则该标志被正确设置,但是如果没有文件系统,则该标志未设置,即使 Windows 正确报告驱动器为只读。
const wchar_t letter = "F";
DWORD filesystemFlags = 0;
TCHAR drivePath[kVolumePathShortLength];
sprintf_s(drivePath, "%c:\\", letter);
const HRESULT result = GetVolumeInformation(drivePath, NULL, 0, NULL, NULL, &filesystemFlags, NULL, 0);
if (SUCCEEDED(result)) {
if (filesystemFlags & FILE_READ_ONLY_VOLUME) {
printf("Drive is read-only\n");
} else {
printf("Drive is not read-only\n");
}
}
如果卷中有文件系统,代码可以正常工作,我认为磁盘管理可能有其他方法检查卷是否只读,无论文件系统如何,它都可以工作。
最佳答案
GetVolumeInformation
适用于卷,而不是磁盘。 GetVolumeInformation
还返回一个 BOOL,而不是 HRESULT,因此您不能相信示例代码的输出!
您可以尝试获取低级磁盘信息:
for (UINT d = 'A'; d <= 'Z'; ++d) // Real code should use GetLogicalDrives
{
WCHAR devbuf[20];
wsprintfW(devbuf, L"\\\\.\\%c:", d);
HANDLE hDev = CreateFileW(devbuf, 0, 7, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDev == INVALID_HANDLE_VALUE) continue;
DWORD cb, gle;
BOOL succ = DeviceIoControl(hDev, IOCTL_DISK_IS_WRITABLE, NULL, 0, NULL, 0, &cb, NULL);
gle = GetLastError();
printf("%c: is %s (error %u)\n", d, succ ? "writable" : gle == ERROR_WRITE_PROTECT ? "read-only" : "unknown", succ ? 0 : gle);
CloseHandle(hDev);
}
这是 Windows 文件系统根据 this thread 执行的操作@OSR:
... the in-box file systems send IOCTL_DISK_IS_WRITEABLE to determine whether the disk is read-only or not.
你也可以试试 IOCTL_DISK_GET_DISK_ATTRIBUTES
但我猜该标志与 IOCTL_DISK_IS_WRITABLE
相同。
This thread声称 IOCTL_VOLUME_GET_GPT_ATTRIBUTES
可以发送到所有磁盘类型,但我不明白为什么这是更好的选择。
关于c - 对于没有任何文件系统的锁定 SD 卡,GetVolumeInformation() 不报告 FILE_READ_ONLY_VOLUME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44703463/
DWORD disk_serialINT[MAX_PATH + 1]; GetVolumeInformationA(NULL, NULL, NULL, disk_serialINT, NULL, NU
我想为我正在编写的程序获取特定驱动器(FAT32、NTFS、FAT16)的文件系统类型。但是当我运行这段代码时,我在 szFileSystemName 变量中得到看似随机的结果。非常感谢任何帮助。 #
MSDN documentation和 knowledge base article GetVolumeInformation 不是很具体文件系统名称字符串可以包含什么。 明显的值是 NTFS、CDF
在使用 Inno Setup 创建的安装过程中,我需要获取驱动器号的卷序列号。我知道可以将 DLL 函数导入 Inno,但我对它很陌生,并且在使其工作时遇到了一些问题。我知道 kernel32 中的
你好, 我使用 GetLogicalDrives 获取所有驱动器,我想进一步使用它来检测驱动器类型,然后使用 GetVolumeInformation 检查特定驱动器的状态。但是,我无法在 GetVo
我正在尝试使用 Detours Express (3.0) Hook GetVolumeInformation,以更改音量序列。问题是每次调用 Hook 函数时,它都会返回一个随机卷序列。 #incl
我想使用 GetVolumeInformation 调用来检索可移动设备的名称。我可以很好地检索名称并将其存储到 TCHAR 数组变量 szVolNameBuff 中。这是我的代码: // Get
在使用 GetVolumeInformation() 报告的 FILE_READ_ONLY_VOLUME 文件系统标志检查 SD 卡是否被锁定时,我得到了一些奇怪的结果. 如果 SD 卡被锁定,并且
我是一名优秀的程序员,十分优秀!