我正在尝试使用Win32应用程序接口在Windows上区分U盘和U盘。
如果驱动器是可移动的,则GetDriveType()函数将返回DRIVE_REMOVABLE,当然,U盘也是可移动的。但我在想,Windows可能认为USB硬盘驱动器也是可移动的(不幸的是,我无法访问USB硬盘驱动器来测试它)。
提前谢谢。
发布于 2011-06-10 15:28:30
如果要确定设备是USB设备,可以打开它的句柄并使用DeviceIoControl()发送IOCTL查询,以获取设备所连接的总线类型。
EnumUsbDrivesLetters -这篇文章是用俄语写的,但它包含了C++源代码,所以这个问题很容易理解。
干杯,安德烈
发布于 2014-10-06 23:06:01
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Method OpenVolume
// Purpose: Open volume for removal. Change to ::CreateFile(volumeName, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
// if you just want to inquire if it's removable.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HANDLE OpenVolume(const char& driveLetter)
{
char volumeName[8] = "";
char* volumeFormat = "\\\\.\\%c:";
sprintf(volumeName, volumeFormat, driveLetter);
HANDLE volume = ::CreateFile(volumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (volume == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE;
DWORD bytesReturned = 0;
STORAGE_HOTPLUG_INFO Info = {0};
if (::DeviceIoControl(volume, IOCTL_STORAGE_GET_HOTPLUG_INFO, 0, 0, &Info, sizeof(Info), &bytesReturned, NULL))
{
if (!(Info.MediaRemovable || Info.DeviceHotplug))
{
::CloseHandle(volume);
::SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
}
return volume;
}
发布于 2010-08-03 03:04:47
实际上windows没有,我的两个usb硬盘GetDriveType都返回了3 (DRIVE_FIXED)。
https://stackoverflow.com/questions/3390865
复制相似问题