Windows下用GetDriveType判断可移动驱动器需传入盘符根目录(如"E:\"),返回DRIVE_REMOVABLE才确认;Linux则需通过/sys/block/*/removable文件值为1判定,且须先验证路径权限与存在性。

Windows下用 GetDriveType 判断是否为可移动驱动器
直接调用 GetDriveType 是最常用且可靠的方式。它返回的类型值中,DRIVE_REMOVABLE 明确表示该路径指向软盘、U盘、SD卡等可移动设备。注意:这个函数只认盘符根目录(如 "D:\"),传入子路径(如 "D:\data\file.txt")会失败或返回 DRIVE_NO_ROOT_DIR。
- 必须以盘符加冒号和双反斜杠结尾,例如
"E:\\";传"E:"或"E:/"都不可靠 - 路径需存在且可访问,若驱动器未插入或权限不足,可能返回
DRIVE_NO_ROOT_DIR或DRIVE_UNKNOWN - 对网络驱动器(
DRIVE_REMOTE)、光驱(DRIVE_CDROM)不误判,但某些带缓存的SSD外置硬盘可能被识别为DRIVE_FIXED(非可移动)
Linux下解析 /sys/block/*/removable 文件
Linux 没有统一API,得靠 sysfs。核心是查对应块设备的 removable 标志位:值为 1 表示可移动(如U盘、USB硬盘),0 通常为内置磁盘。关键难点在于从路径反推设备名(如 /dev/sdb)。
- 先用
stat()获取文件系统挂载点,再通过/proc/mounts或findmnt查出对应设备节点 - 然后读取
/sys/block/<var>device_name</var>/removable,比如/sys/block/sdc/removable - 注意:NVMe设备(如
nvme0n1)也支持该接口,但部分厂商固件可能未正确设置该标志 - 不要依赖
/proc/scsi/scsi或lsusb输出——它们无法覆盖所有USB存储芯片方案
跨平台时别碰 GetVolumeInformation 或 statfs 的文件系统类型
有人试图用文件系统名(如 FAT32、exFAT)反推可移动性,这是危险的。NTFS U盘、ext4 SD卡、甚至 APFS 外置 SSD 都存在,仅凭 FS 类型完全不可靠。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
GetVolumeInformation返回的lpFileSystemNameBuffer对 Windows 无判断价值 -
statfs.f_type在 Linux 上返回的是内核定义的魔数(如0xef53代表 ext4),和物理设备无关 - 更糟的是,某些 USB 桥接芯片会让设备报告为
DRIVE_FIXED却实际可拔插——此时唯一可信的是硬件层上报的 removable 标志
实际编码时最容易漏掉的边界检查
多数人只测了“U盘插着”的情况,却忽略三类典型失效场景:驱动器空闲未格式化、权限被策略禁用、符号链接指向可移动路径但本身在系统盘。
立即学习“C++免费学习笔记(深入)”;
- Windows 下务必检查
GetDriveType返回值是否为DRIVE_REMOVABLE且不等于DRIVE_NO_ROOT_DIR - Linux 下读
/sys/block/*/removable前要access("/sys/...", R_OK),否则可能因权限或路径不存在而崩溃 - 绝对不要对路径做字符串匹配(如含 “USB”、“Removable” 就判定),用户可任意命名卷标或挂载点

















