我有一个读卡器(没有插入记忆棒)。
当我插入我的电脑时,它在我的电脑中显示一个空的驱动器...
是否可以知道驱动器是否有媒体(对不起,我不知道如何调用它)或不...
答案 0 :(得分:11)
我发现 MSalters 的建议非常好用IOCTL_STORAGE_CHECK_VERIFY
。使用IOCTL_STORAGE_CHECK_VERIFY
时有一个小技巧。在函数DeviceIoControl
中使用IOCTL代码之前,需要打开CreateFile
函数的相应设备:
HANDLE hDevice = CreateFile (szDeviceName, // like "\\.\E:"
0, // no access to the drive
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, OPEN_EXISTING, 0, NULL);
对于DeviceIoControl
的使用,可以使用0作为CreateFile
的第二个参数,因为我们不会使用ReadFile
,WriteFile
等函数来访问设备。 IOCTL_STORAGE_CHECK_VERIFY
的实施遵循一些数据请求读取。因此,为了能够在没有IOCTL_STORAGE_CHECK_VERIFY
(5)错误的情况下使用ERROR_ACCESS_DENIED
,我们必须按以下方式打开设备
HANDLE hDevice = CreateFile (szDeviceName, // like "\\.\E:"
FILE_READ_DATA, // read access to the data
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, OPEN_EXISTING, 0, NULL);
存在IOCTL_STORAGE_CHECK_VERIFY
- IOCTL_STORAGE_CHECK_VERIFY2
的另一个版本,其作用与IOCTL_STORAGE_CHECK_VERIFY
完全相同,但速度更快(请参阅http://msdn.microsoft.com/en-us/library/ff560538.aspx)。要使用IOCTL_STORAGE_CHECK_VERIFY2
,可以打开只有FILE_READ_ATTRIBUTES
访问权限的设备:
HANDLE hDevice = CreateFile (szDeviceName, // like "\\.\E:"
FILE_READ_ATTRIBUTES, // read access to the attributes
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, OPEN_EXISTING, 0, NULL);
测试驱动器中媒体是否存在的代码可能如下所示
DWORD cbBytesReturned;
bSuccess = DeviceIoControl (hDevice, // device to be queried
IOCTL_STORAGE_CHECK_VERIFY2,
NULL, 0, // no input buffer
NULL, 0, // no output buffer
&cbBytesReturned, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
if (bSuccess)
_tprintf (TEXT("the device media are accessible\n"));
else if (GetLastError() == ERROR_NOT_READY)
_tprintf (TEXT("the device media are not accessible\n"));
答案 1 :(得分:3)
此行为的原因是历史性的,并且可以追溯到软盘驱动器和MS-DOS。 A:
驱动器仍然是A:
驱动器,即使其中没有软盘也是如此。
有时可以检查带有可移动介质的驱动器是否为空。读卡器和CD驱动器通常支持这一点,软盘驱动器不支持。您可以将驱动器发送IOCTL_STORAGE_CHECK_VERIFY
。