Windows下用GetDriveType判断网络驱动器最直接:传入规范化的驱动器根路径(如"Z:")返回DRIVE_REMOTE即表示映射的网络驱动器;UNC路径需先用PathIsUNC识别,再结合WNetGetConnection验证映射关系。

Windows下用GetDriveType判断网络驱动器
在Windows平台,GetDriveType 是最直接的手段——它能区分本地磁盘、RAM盘、CD-ROM和网络驱动器。关键在于:只有映射的网络驱动器(如 Z:)会返回 DRIVE_REMOTE,而UNC路径(如 \servershare)本身不对应驱动器,调用前必须先解析或转换。
- 对形如
"Z:\data"的路径,提取根目录("Z:\")后传给GetDriveType,返回DRIVE_REMOTE即为网络映射盘 - 对UNC路径,不能直接传给
GetDriveType(会返回DRIVE_NO_ROOT_DIR),需先用PathIsUNC或手动检查前缀 -
GetDriveType不依赖网络连通性,即使共享不可达也仍可识别映射关系
用PathIsUNC识别原始UNC路径
PathIsUNC(来自 shlwapi.h)专用于检测路径是否以 "\\" 开头且符合UNC格式,比如 "\\server\share" 或 "\\server\share\subdir"。它不验证服务器是否存在,只做字符串模式匹配。
- 必须链接
shlwapi.lib,否则链接失败 - 注意:路径开头必须是双反斜杠,
"//server/share"或带空格的"\\server\share with space"都会返回FALSE - 它不处理驱动器映射后的路径,比如
"Z:\data"永远返回FALSE,哪怕Z:本身是映射的网络盘
结合GetFileAttributesEx避免假阳性
仅靠字符串判断有风险:用户可能伪造一个以 "\" 开头的本地路径(如 "\.pipexxx" 或非法路径),PathIsUNC 会误报。更稳妥的方式是先确认路径存在且可访问,再判断类型。
- 调用
GetFileAttributesEx,若返回TRUE且lpFindFileData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY成立,说明是真实存在的目录 - 再配合
PathIsUNC或驱动器类型判断,能排除伪UNC路径 - 注意:
GetFileAttributesEx对不可达的UNC路径会失败(GetLastError()返回ERROR_BAD_NETPATH或ERROR_NETWORK_UNREACHABLE),此时不能断定“不是网络目录”,只是当前不可访问
跨平台方案只能靠路径特征+运行时探测
C++标准库(包括 std::filesystem)不提供网络共享目录的抽象概念。Linux/macOS 无原生“网络共享目录”类型,SMB/NFS挂载点与本地目录在文件系统层面无本质区别——它们只是普通挂载点。
立即学习“C++免费学习笔记(深入)”;
- POSIX下只能通过
statfs或getmntent查看挂载类型(如"cifs"、"nfs"),但需 root 权限或读取/proc/mounts -
std::filesystem::is_directory和std::filesystem::exists无法区分本地或远程,仅反映路径可达性 - 试图统一 Windows/POSIX 判断逻辑基本不可行:语义不同、API不同、权限模型不同;硬写跨平台函数容易在某平台漏判或误判
真正麻烦的地方不在代码怎么写,而在“网络共享目录”这个概念本身——Windows里是明确的系统对象,Linux里只是挂载行为的结果。没想清楚目标平台和定义边界,所有判断都可能跑偏。


















