getlogicaldrives 返回 dword 位掩码,bit0~bit25 分别对应 a:~z: 驱动器是否存在,需用位运算(如 drives & (1

GetLogicalDrives 返回的是位掩码,不是驱动器列表
很多人调用 GetLogicalDrives() 后直接想遍历返回值当数组用,结果崩溃或漏盘——它返回的是一个 DWORD,每一位代表一个驱动器是否存在(bit 0 = A:,bit 1 = B:,… bit 25 = Z:)。你得手动检查哪些位被置 1。
- 必须用位运算逐个判断:
(drives & (1 ,i 从 0 到 25 - 驱动器号是字符计算出来的:
char driveLetter = 'A' + i,再拼上":\" - 注意:返回值为 0 表示没有可用驱动器(极少见),但更常见的是权限不足导致某些驱动器不显示(比如网络驱动器未映射或被策略隐藏)
GetDiskFreeSpaceEx 要求路径末尾带反斜杠,且不能是根目录的“裸字母”
GetDiskFreeSpaceEx() 对参数很敏感:传 "C:" 会失败(ERROR_INVALID_PARAMETER),传 "C:\\" 才行;如果路径不存在或无访问权限,它返回 FALSE,且 lpFreeBytesAvailable 等输出参数值未定义——别假设它们是 0。
- 构造路径时务必用
std::string(1, driveLetter) + ":\\",双反斜杠是字面量需要转义 - 调用前先用
GetDriveType()过滤掉DRIVE_NO_ROOT_DIR或DRIVE_UNKNOWN类型,避免无效调用 - 对可移动设备(如 U 盘)或光驱,即使
GetLogicalDrives()显示了该盘符,GetDiskFreeSpaceEx()也可能因介质未就绪而失败
剩余容量单位是字节,但显示时要注意整数溢出和符号问题
GetDiskFreeSpaceEx() 输出的三个参数都是 ULARGE_INTEGER*,底层是 ULONGLONG。如果你用 long long 接收并除以 1024 做换算,没问题;但若误用 long(在 Windows x64 上仍是 32 位),高位会被截断,显示成负数或极小值。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 安全做法:统一用
uint64_t或ULONGLONG接收,再做除法 - 换算 KiB/MiB/GiB 时,用
/ 1024、/ (1024 * 1024)等,别用pow(1024, n)——编译器可能优化成浮点,引入精度误差 - 空闲空间可能为 0(满盘)或接近
ULLONG_MAX(例如某些网络驱动器或 CD-ROM 未加载时),需单独判断是否有效
权限和 UAC 会影响实际获取到的驱动器数量
标准用户进程无法读取 BitLocker 加密卷的剩余空间(即使盘符可见),也无法访问被组策略隐藏的驱动器(如禁用软盘、CD-ROM 的策略)。UAC 提权后仍不能绕过这些限制——这不是权限问题,而是系统级过滤。
- 不要依赖
GetLogicalDrives()结果和资源管理器显示完全一致;它反映的是当前会话下“操作系统允许你看到的”逻辑盘符 - 若需更高一致性,可补充读取
WMIC LOGICALDISK GET DeviceID,FreeSpace,Size(需启动wmic.exe进程),但会慢、有 Shell 依赖、且同样受策略约束 - 真实场景中,建议把“获取失败”的驱动器记录为
unknown而非跳过,否则用户会疑惑“为什么 D: 没显示”
最麻烦的不是 API 调用本身,而是每个驱动器都可能处于不同状态:存在但不可访问、存在但无介质、存在但拒绝返回空间数据。别试图一次调用覆盖所有情况,分层检查才是稳妥做法。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










