Windows下用GetDriveType判断网络驱动器最常用且可靠,需传入规范化驱动器根路径(如"Z:"),返回DRIVE_REMOTE即表示网络驱动器;UNC路径则需结合PathIsUNC和WNetGetConnection验证。

Windows下用GetDriveType判断路径所属驱动器类型
直接调用GetDriveType是最常用且可靠的方式,它不依赖文件系统挂载状态或权限,只看驱动器物理属性。传入路径时需先提取根目录(如"E:\data\file.txt" → "E:\"),否则返回DRIVE_NO_ROOT_DIR。
- 必须确保路径格式合法:以
"X:\"或"\server\share"开头;相对路径、无盘符路径(如"temp\")会失败 -
GetDriveType返回DRIVE_REMOVABLE才表示可移动媒体(U盘、SD卡、外置硬盘等),但注意某些USB硬盘可能被识别为DRIVE_FIXED(取决于固件和控制器) - 若路径跨网络重定向(如OneDrive同步文件夹),
GetDriveType仍返回其底层物理驱动器类型,不是“云存储”本身
Linux下通过sysfs和udev属性识别可移动设备
Linux没有统一API,得组合/sys/block/*/removable和/sys/block/*/ro判断。先用stat()获取路径所在块设备名(如/dev/sdb1),再查对应sysfs节点。
- 关键检查项:
/sys/block/sdb/removable内容为"1",且/sys/block/sdb/ro为"0"(排除只读光盘) - 注意软链接干扰:
/dev/disk/by-uuid/...这类路径需先realpath()解析到底层/dev/sdX - 某些NVMe U盘或雷电设备可能出现在
/sys/block/nvme0n1p1下,同样适用该逻辑,但需确认removable文件存在(部分内核版本可能缺失)
跨平台时避免依赖文件系统特性
别用GetVolumeInformation查FILE_REMOTE_DEVICE标志,或Linux下查statfs.f_type是否为MS_DOS——这些只反映格式,不反映物理可移动性。一张NTFS格式的内置SSD和U盘都会返回相同值。
- Windows的
DRIVE_REMOVABLE≠ “一定是U盘”,也包含软驱、Zip驱动器等已淘汰设备,但现代系统基本只剩U盘/SD卡 - Linux的
removablesysfs属性由内核块层设置,比udevadm info --query=property更底层、更稳定 - 如果路径指向FAT32/exFAT分区,不能反推它是可移动介质——很多内置eMMC也用这些格式
实际代码中要处理的边界情况
用户输入路径可能含尾部斜杠、点号、空格,或根本不存在。这些都会让驱动器提取或设备查找失败。
立即学习“C++免费学习笔记(深入)”;
- Windows:用
PathStripToRoot或手动截取第一个':'加"\",再调GetDriveType;若返回0,说明路径无效 - Linux:用
stat()获取st_dev,再遍历/sys/dev/block/*找匹配的major:minor,比字符串解析/proc/mounts更可靠 - 权限问题:非root用户也能读
/sys/block/*/removable,但stat("/dev/sdb1")可能因无读权限失败,此时应降级尝试仅解析挂载点(/proc/mounts中找对应source字段)
可移动性的判定本质是硬件属性查询,不是文件操作。绕开权限、格式、挂载状态这些干扰项,直奔驱动器/块设备的物理标识,才能少踩坑。


















