Windows系统下如何获取已连接存储设备及其相关信息
Windows存储设备信息查询API选型说明
核心选型判断标准
- 仅需识别带盘符的常规存储设备(本地硬盘、U盘、挂载后有盘符的SD卡、移动硬盘等):优先使用
fileapi.h中的卷管理函数,开发门槛最低 - 需要识别无盘符设备、MTP/PTP协议便携设备(手机、相机、未挂载的SD卡读卡器等):选择
IPortableDeviceManager相关的WPD(Windows Portable Devices)API
卷管理函数实现方案(入门首选)
核心调用接口
- 枚举系统所有盘符:调用
GetLogicalDriveStringsW()或GetLogicalDrives() - 单盘符属性查询:
- 设备类型判断:
GetDriveTypeW(),返回值可区分固定硬盘、可移动磁盘、光盘、RAM盘等类别 - 容量信息获取:
GetDiskFreeSpaceExW(),可直接返回总容量、空闲容量、当前用户可用容量三个数值 - 显示名称获取:
GetVolumeInformationW(),可读取到卷标作为设备显示名称
- 设备类型判断:
示例代码片段
#include <windows.h> #include <tchar.h> #include <stdio.h> int _tmain() { WCHAR driveBuf[512] = {0}; // 枚举所有盘符 GetLogicalDriveStringsW(ARRAYSIZE(driveBuf)-1, driveBuf); WCHAR* pCurDrive = driveBuf; while (*pCurDrive) { wprintf(L"盘符:%s\n", pCurDrive); // 获取设备类型 UINT driveType = GetDriveTypeW(pCurDrive); wprintf(L"设备类型:%d\n", driveType); // 对应宏可查Win32文档,比如DRIVE_REMOVABLE是可移动盘 // 获取容量信息 ULARGE_INTEGER freeAvail, total, totalFree; if (GetDiskFreeSpaceExW(pCurDrive, &freeAvail, &total, &totalFree)) { wprintf(L"总容量:%llu 字节\n", total.QuadPart); wprintf(L"空闲容量:%llu 字节\n", totalFree.QuadPart); } // 获取卷标 WCHAR volName[MAX_PATH] = {0}; GetVolumeInformationW(pCurDrive, volName, ARRAYSIZE(volName), NULL, NULL, NULL, NULL, 0); wprintf(L"卷标(显示名称):%s\n\n", volName); pCurDrive += wcslen(pCurDrive) + 1; } return 0; }
方案优缺点
- 优点:调用逻辑简单,不需要掌握COM编程知识,运行速度快,适合新手快速实现需求
- 缺点:无法识别无盘符的设备,也不支持MTP协议的手机、相机等便携设备,设备类型判断粒度较粗
WPD API实现方案(全设备支持)
核心调用逻辑
- 先初始化COM运行环境,调用
CoInitializeEx() - 实例化
IPortableDeviceManager接口 - 调用
GetDevices()方法枚举所有连接的便携设备 - 对每个设备打开连接后,可读取设备型号、存储容量、设备类型等全量属性
方案优缺点
- 优点:覆盖所有类型的外接存储/便携设备,可识别SD卡、手机、相机等细分设备类型,支持读取无盘符设备信息
- 缺点:基于COM接口开发,需要掌握COM编程的基础规则,代码量更大,调试成本更高
内容的提问来源于stack exchange,提问作者Toasdn
相关产品推荐
相关产品推荐

