getdrivetype是windows下判断网络驱动器最常用方式,传入规范化的驱动器根路径(如"z:")返回drive_remote即表示映射的网络驱动器;对unc路径需改用pathisunc和wnetgetconnection组合验证。

Windows下用GetDriveType判断网络驱动器路径
直接调用GetDriveType是最常用且可靠的方式。它不依赖路径是否存在或是否可访问,只看驱动器根路径的类型。传入形如 "Z:\" 或 "Z:/" 的驱动器根路径(注意必须是根,"Z:\data" 会返回 DRIVE_NO_ROOT_DIR)。
常见错误是传入非根路径或未规范化路径。比如 "z:\foo\..\bar" 不会自动解析为 "z:\",必须先用 PathCanonicalize 或 GetFullPathName 提取驱动器根。
- 先用
GetFullPathName获取驱动器前缀(如"Z:\"),再传给GetDriveType - 返回值为
DRIVE_REMOTE表示网络驱动器(包括映射的SMB、WebDAV、OneDrive 挂载点等) - 若路径不含驱动器字母(如 UNC 路径
"\\server\share"),GetDriveType不适用,需走另一路
处理UNC路径:用PathIsUNC和WNetGetConnection
UNC路径("\\server\share")本身即代表网络位置,但有时需要确认其后端是否真实可达或是否被重定向。此时不能只靠字符串匹配,因为本地符号链接或DFS可能伪装成UNC格式。
PathIsUNC 只做语法判断,轻量但易误判;更稳妥的是结合 WNetGetConnection 检查映射关系 —— 即使是 "Z:" 这样的盘符,背后也可能通过 WNetAddConnection2 映射到 UNC,而 GetDriveType("Z:") 仍返回 DRIVE_REMOTE。但若想确认该盘符是否“当前有效连接”,就得调用 WNetGetConnection 并检查返回值是否为 NO_ERROR。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
PathIsUNC("\\?\UNC\server\share")返回TRUE,但这种格式是NT命名空间,普通API可能不识别 -
WNetGetConnection("Z:", ...)成功时,输出缓冲区会填入实际的 UNC 路径,可进一步验证 - 若
WNetGetConnection失败(如断网或权限不足),不代表不是网络驱动器,只是当前不可达
C++跨平台方案不存在,Linux/macOS没有“网络驱动器”概念
这是关键前提:所谓“网络驱动器”是Windows特有的抽象,源于DOS时代的驱动器盘符体系。Linux/macOS用挂载点(mount point)表示远程文件系统,判断逻辑完全不同 —— 需读取 /proc/mounts(Linux)或运行 mount 命令解析输出,检查 fstype 是否为 cifs、nfs、afp、webdav 等。
如果你在写跨平台代码,不要试图封装一个统一函数。C++标准库(包括 <filesystem></filesystem>)不提供此类信息;Boost.Filesystem 也不暴露挂载类型。硬要统一,只能按平台条件编译,且行为语义必然不一致:Windows返回“是否映射”,Linux返回“是否挂载为网络文件系统”。
-
std::filesystem::status(path).type()对所有远程挂载点都返回directory或regular,无法区分本地/网络 - Linux下
statfs的f_type字段可识别文件系统类型,但需 root 权限才能保证覆盖全部挂载点 - macOS建议用
getmntinfo+strcmp(mnt_fsname, "smbfs")等方式,而非解析mount输出(格式不稳定)
容易忽略的边界情况:OneDrive/Google Drive/WSL2挂载点
现代同步客户端(OneDrive、Google Drive Desktop)和 WSL2 的 Windows 访问路径(\wsl$)会让判断变得更模糊。它们在Windows API层面常表现为 DRIVE_FIXED(固定磁盘),因为底层是重定向文件系统(RDBSS)或9P协议,而非传统网络重定向器(RDBSS不触发DRIVE_REMOTE)。
这类路径虽物理存储在远程服务器,但Windows不认为它是“网络驱动器”。若业务逻辑真正关心的是“数据是否实时在线同步”或“离线时是否不可用”,仅靠 GetDriveType 就会漏判。此时需额外检查:GetFileAttributes 是否含 FILE_ATTRIBUTE_OFFLINE,或调用 SHParseDisplayName + IShellFolder::GetAttributesOf 查询同步状态。
-
\wsl$Ubuntuhomeuser在GetDriveType下返回DRIVE_FIXED,但它本质是网络协议桥接 - OneDrive 文件夹可能标记
FILE_ATTRIBUTE_SYNC_ROOT,需FindFirstFileEx+FILE_ID_BOTH_DIR_INFO获取扩展属性 - 没有通用低成本方法能 100% 判断“是否依赖网络”,只能按具体场景叠加多个信号
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










