2016-03-03 5 views
0

Письмо флэш-накопителя USB изменчиво, и я не знаю, как это обнаружить или если есть несколько флеш-накопителей с помощью C++ или с помощью команды консоли (возможно, ярлык существует как% APPDATA%).Как обнаружить букву флэш-накопителя USB

Как я могу это сделать?

+0

Предполагая, что есть больше чем один флэш-диск, как вы знаете, какой из них «твой»? –

+0

Не важно, я должен скопировать файл на все флешки. – Enes

+0

Создание вируса? :) – Eugene

ответ

2

В этом случае вы можете использовать функцию GetDriveType:

UINT WINAPI GetDriveType(
    _In_opt_ LPCTSTR lpRootPathName 
); 

Определяет диск является ли съемный, фиксированный, CD-ROM, RAM диск или сетевой диск.

Этого достаточно, если тип привода не имеет для вас никакого значения. Если вы заинтересованы в листинг только флэш-накопители USB, рассмотреть возможность проверить функцию SetupDiGetDeviceRegistryProperty:

BOOL SetupDiGetDeviceRegistryProperty(
    _In_  HDEVINFO   DeviceInfoSet, 
    _In_  PSP_DEVINFO_DATA DeviceInfoData, 
    _In_  DWORD   Property, 
    _Out_opt_ PDWORD   PropertyRegDataType, 
    _Out_opt_ PBYTE   PropertyBuffer, 
    _In_  DWORD   PropertyBufferSize, 
    _Out_opt_ PDWORD   RequiredSize 
); 

Функция SetupDiGetDeviceRegistryProperty извлекает определенную подключи и играй свойства устройства.

Вот пример:

#include "stdafx.h" 
#include <setupapi.h> 
#include <devguid.h> 
#include <cfgmgr32.h> 

... 

HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_USB, 
             NULL, NULL, DIGCF_PRESENT); 

if (hdevinfo == INVALID_HANDLE_VALUE) 
    return -1; 

DWORD MemberIndex = 0; 
SP_DEVINFO_DATA sp_devinfo_data; 

ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data)); 
sp_devinfo_data.cbSize = sizeof(sp_devinfo_data); 

while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) 
{ 
    DWORD PropertyRegDataType; 
    DWORD RequiredSize; 
    DWORD PropertyBuffer; 

    if (SetupDiGetDeviceRegistryProperty(hdevinfo, 
             &sp_devinfo_data, 
             SPDRP_CAPABILITIES, 
             &PropertyRegDataType, 
             (PBYTE) &PropertyBuffer, 
             sizeof(PropertyBuffer), 
             &RequiredSize)) 
    { 
    if (PropertyBuffer & CM_DEVCAP_REMOVABLE) 
    { 
     // Do something, copy your files etc 
    } 
    }  
    MemberIndex++; 
} 

SetupDiDestroyDeviceInfoList(hdevinfo); 
+2

Или, если вы хотите найти флешки в пакетном файле, переадресуйте 'FOR %% d IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO FSUTIL fsinfo drivetype %% d:' в файл и проанализировать вывод. – vitsoft

Смежные вопросы