如何检测USB闪存盘的字母

时间:2016-03-03 18:41:31

标签: c++ winapi cmd

USB闪存盘的信件是可更改的,我不知道如何通过使用C ++或控制台线命令检测到这个或是否有多个闪存驱动器(可能存在快捷方式,如%APPDATA%)

我该怎么做?

1 个答案:

答案 0 :(得分: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);