USB闪存盘的信件是可更改的,我不知道如何通过使用C ++或控制台线命令检测到这个或是否有多个闪存驱动器(可能存在快捷方式,如%APPDATA%)
我该怎么做?
答案 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);