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

时间:2010-07-01 13:06:14

标签: windows winapi msdn

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

当我插入我的电脑时,它在我的电脑中显示一个空的驱动器...

是否可以知道驱动器是否有媒体(对不起,我不知道如何调用它)或不...

2 个答案:

答案 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的第二个参数,因为我们不会使用ReadFileWriteFile等函数来访问设备。 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