如何判断一个驱动程序是C ++中的软盘还是可移动的闪存盘?

我不知道是否有一个API区分软盘和闪存磁盘在Windows中,C + +是否有可能连接闪存盘到A:\? 非常感谢!

首先,您需要获取驱动器的类型(GetDriveTypeA)。 如果结果等于DRIVE_REMOVABLE,字母驱动器将指向可移动闪存驱动器(或其他类型的可移动磁盘)的软盘。 如果结果不是DRIVE_REMOVABLE,这是不可能的,这是一个可移动的闪存驱动器。 不过从Window的角度来看,外接的USB硬盘和可移动的闪盘并没有什么区别(我认为唯一的区别就是可移动的闪盘没有分区表,所以它只有一个分区 – 虽然我不是很确定)。

无论如何,对于DRIVE_REMOVABLE类型,您需要查询设备的更高级属性。 为了做到这一点,首先你需要打开物理设备,像这样:

hDevice = CreateFileA("\\\\?\\X:", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL) 

如果打开成功,则需要向此设备发出一个DeviceIoControl命令:

STORAGE_PROPERTY_QUERY Query; Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; bResult = DeviceIoControl( hDevice, // device handle IOCTL_STORAGE_QUERY_PROPERTY, // info of device property &Query, sizeof(STORAGE_PROPERTY_QUERY), // input data buffer pDevDesc, pDevDesc->Size, // output data buffer &dwOutBytes, // out's length (LPOVERLAPPED)NULL );
STORAGE_PROPERTY_QUERY Query; Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; bResult = DeviceIoControl( hDevice, // device handle IOCTL_STORAGE_QUERY_PROPERTY, // info of device property &Query, sizeof(STORAGE_PROPERTY_QUERY), // input data buffer pDevDesc, pDevDesc->Size, // output data buffer &dwOutBytes, // out's length (LPOVERLAPPED)NULL ); 

如果pDevDesc-> BusType == BusTypeUsb,则X:指向一个可移动的闪存驱动器。 代码工作,但是你需要阅读DeviceIoControl的文档,以设置pDevDesc参数。 如果你有问题,我可以给你整个代码。

您可以在系统控制的某处更改分配给驱动器的字母,因此闪存盘可以是A :.

使用操作系统API来查询例如。 磁盘的大小,这应该足以区分软盘和闪存盘。

可以将闪存盘连接到A :,但前提是没有软盘驱动器。
有关如何在程序中执行此操作的信息,请参阅定义一个MS-DOS设备名称 。

您可以通过在驱动器号上使用QueryDosDevice来确定驱动器号是否映射到软盘设备。 软盘驱动器将返回“\ Device \ Floppy0”或“\ Device \ Floppy1”