如何检测介质是否插入可移动驱动器/读卡器

我有一个读卡器(没有插入记忆棒)。

当我插入我的电脑它显示我的电脑中的空驱动器…

是否有可能知道一个驱动器是否有一个媒体(抱歉,我不知道如何调用它)或不…

Solutions Collecting From Web of "如何检测介质是否插入可移动驱动器/读卡器"

我发现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的第二个参数,因为我们不会使用ReadFileWriteFile等函数来访问设备。 IOCTL_STORAGE_CHECK_VERIFY实现遵循一些数据请求的读取 。 所以为了能够使用IOCTL_STORAGE_CHECK_VERIFY而不会有ERROR_ACCESS_DENIED (5)错误,我们必须打开设备如下

 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_VERIFYIOCTL_STORAGE_CHECK_VERIFY2 ,它与IOCTL_STORAGE_CHECK_VERIFY工作方式完全相同,但速度更快(请参阅http://msdn.microsoft.com/zh-cn/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")); 

这种行为的原因是历史的,可以追溯到软盘驱动器和MS-DOS。 A:驱动器仍然是A:驱动器,即使它没有软盘。

有时可以检查带有可移动介质的驱动器是否为空。 读卡器和CD驱动器通常支持这一点,软盘驱动器不支持。 您将发送一个IOCTL_STORAGE_CHECK_VERIFY驱动器。