Как определить, является ли драйвер дискетой или съемной флешкой на C ++?

Интересно, есть ли API для различения дискеты и флешки в windows, C ++ И можно ли привязать флешку к A: \? Огромное спасибо!


person user25749    schedule 01.02.2010    source источник
comment
См. Здесь: stackoverflow.com/questions/1797128/   -  person stephan    schedule 01.02.2010


Ответы (3)


Во-первых, вам нужно получить тип диска (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
    );


Если pDevDesc-> BusType == BusTypeUsb, то X: указывает на съемную флешку. Код работает, однако вам необходимо прочитать документацию для DeviceIoControl, чтобы настроить параметр pDevDesc. Если у вас возникнут проблемы, я могу предоставить вам весь код.

person botismarius    schedule 01.02.2010
comment
Предположительно для флоппи-дисковода USB pDevDesc->BusType == BusTypeUsb тоже. - person MSalters; 02.02.2010
comment
Да, но вопрос не касался флоппи-дисководов usb: D - person botismarius; 02.02.2010

Вы можете изменить буквы, присвоенные вашим дискам, где-нибудь в System Control, так что флэш-диск может быть A :.

Используйте API ОС для запроса, например. размер диска, которого должно хватить, чтобы различать дискету и флешку.

person user231967    schedule 01.02.2010

Можно связать флэш-диск с A :, но только если у вас нет дисководов для гибких дисков.
См. Определение имени устройства MS-DOS для получения информации о том, как это сделать в программе.

Вы можете определить, соответствует ли буква диска устройству гибких дисков, используя QueryDosDevice на букву диска. Дисководы возвращают "\ Device \ Floppy0" или "\ Device \ Floppy1"

person John Knoeller    schedule 01.02.2010
comment
Обратите внимание, что имена \Device\Floppy<x> не (всегда) используются для USB-дисководов гибких дисков. - person MSalters; 01.02.2010
comment
@MSalters: ну что ж, жаль. Спасибо за информацию. - person John Knoeller; 01.02.2010
comment
Посмотрите на локон Стефана - у него есть ответ. - person MSalters; 02.02.2010