Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [FAQ] Получить буквы дисков всех подключенных USB-флэшек  (Прочитано 15988 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Topic
Интересующийся

ru
Offline Offline

« : 26-09-2010 14:00 » 

Как узнать буквы дисков всех подключенных USB-флэшек?

Пробовал для перечисления всех дисковых устройств использовать FindFirstVolumeW / FindNextVolumeW.
Они выдают такое "\\?\Volume{91019513-10d6-11df-8c6f-806d6172696f}\".
Далее с помощью функции GetVolumePathNamesForVolumeNameW получал уже букву диска, например "F:\".

Всё хорошо, только вот находит он таким способом все дисковые устройства (разделы жестких дисков, CD-Rom-ы и т.д.), а как найти именно те тома, которые являются USB-устройствами?


В мсдн-е я смотрел, там написано, чтобы определить что дисковое устройство является USB-флэшкой нужно вызвать SetupDiGetDeviceRegistryPropertyA с третьим параметром SPDRP_REMOVAL_POLICY и тогда 5ый параметр короче должен быть в нем значение 3, в этом случае это флэшка.

Так вот, я всё это сделал, но в этом случае никак и нигде не получить букву диска, так как SetupDiGetDeviceRegistryPropertyA и GetVolumePathNamesForVolumeNameW никак не связаны.

Короче, что делать? Нужно получить букву диска для каждой USB-флэшки.
« Последнее редактирование: 27-09-2010 07:04 от Алексей1153++ » Записан
zubr
Гость
« Ответ #1 : 27-09-2010 07:01 » 

1. GetLogicalDriveStrings - получаем список логических дисков в виде буквы.
2. GetDriveType("c:\\") - получаем тип диска для каждой буквы.
DRIVE_REMOVABLE - флешка
DRIVE_FIXED - жесткий диск
DRIVE_CDROM - CD-ром
Записан
Topic
Интересующийся

ru
Offline Offline

« Ответ #2 : 27-09-2010 07:19 » 

Спасибо. Я смотрел эту фунцию тоже.

Дело в том, что DRIVE_REMOVABLE - это не только флешка, но ещё и floppy drive, thumb drive, or flash card reader.

Если флоппик ещё можно отделить (он обычно A:\ или B:\), то что такое thumb drive?
А хотелось бы именно флэшки перечислить.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 27-09-2010 07:47 » 

Думаю, надо смотреть в сторону SetupDi*-функций. По форуму несколько раз тема обсуждалась, например, здесь: https://forum.shelek.ru/index.php/topic,793.0.html
С год назад мы подобную функцию для поиска USB-накопителей делали в одном продукте, но это надо до архива исходников добраться. Правда, нам нужен был сам факт, а не буква флешки - но сопоставить данные, наверное, можно.
« Последнее редактирование: 27-09-2010 07:49 от Вад » Записан
zubr
Гость
« Ответ #4 : 27-09-2010 10:16 » 

SetupDi-функции, также как и WMI-классы Win32_DiskDrive, Win32_USBHub дадут только список USB и/или дисковых устройств (HARD) никаким боком не связанных с буквами логических дисков. Отделить по букве диска flash card reader от флешки врядли удастся, имхо.
Единственное, чем то еще может помочь, кроме GetDriveType, функция QueryDosDevice. У меня на компе она показывает следующие значения:
для флопика: \Device\Floppy0
для с (hard): \Device\HarddiskVolume1
для d (hard): \Device\HarddiskVolume2
для флешки: \Device\Harddisk1\DP(1)0-0+5
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 27-09-2010 17:10 » 

еще можно покурить тут
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Topic
Интересующийся

ru
Offline Offline

« Ответ #6 : 01-10-2010 13:26 » 

Спасибо за ценную информацию, друзья.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines