getdrivetype是windows下判断网络驱动器最直接可靠的方式,需传入根路径(如"z:\")并返回drive_remote;unc路径需用wnetgetconnection反查是否映射为驱动器。

Windows下用GetDriveType判断网络驱动器路径
在Windows平台,GetDriveType 是最直接、可靠的方式判断路径是否位于网络驱动器(如 Z: 映射到 \servershare)。它不依赖路径是否存在或可访问,只看驱动器类型。
关键点:必须传入**根目录路径**(如 "Z:\"),不能是任意子路径(如 "Z:\data\file.txt")——否则会返回 DRIVE_NO_ROOT_DIR 或错误结果。
- 先用
PathGetDriveNumber或手动提取盘符 +":\"构造根路径 - 调用
GetDriveType,返回DRIVE_REMOTE即表示网络驱动器 - 若路径不含盘符(如 UNC 路径
"\\server\share"),GetDriveType不适用,需单独处理
如何安全提取盘符并构造有效根路径
用户传入的路径可能是 "C:\foo\bar"、"z:/qux"、甚至 "..\relative"。不能简单截前两位。
推荐用 PathStripToRoot(shlwapi.h)自动归一化:
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
std::string getRootPath(const std::string& path) {
char root[MAX_PATH] = {};
if (PathStripToRootA(const_cast<char>(path.c_str()), root)) {
return std::string(root);
}
return {}; // 无法提取根,如纯相对路径或UNC
}</char></shlwapi.h>
注意:PathStripToRoot 对 UNC 路径("\hostsharepath")返回空字符串,此时需走另一条判断逻辑。
处理UNC路径:用WNetGetConnection验证映射关系
如果路径以 "\\\" 开头(UNC 格式),它本身已是网络路径,但用户可能想知道它是否对应某个已映射的驱动器(比如 Z: 实际指向 \\srv\data)。这时要用 WNetGetConnection 反查。
常见误区:直接认为所有 UNC 都算“网络驱动器”——但严格来说,“网络驱动器”特指通过 net use 或图形界面映射出的带盘符路径。
- 对 UNC 路径,先调用
WNetGetConnection查是否有本地盘符映射到该 UNC - 若成功返回盘符(如
"Z:"),说明该 UNC 已被映射为网络驱动器 - 若失败(
ERROR_NOT_CONNECTED),则只是普通 UNC 路径,不属于“网络驱动器”范畴
跨平台不可行,别试图抽象封装
C++ 标准库(<filesystem></filesystem>)完全不提供驱动器类型信息;POSIX 系统(Linux/macOS)根本没有“网络驱动器”概念——NFS/SMB 挂载点和本地目录在内核层面无本质区别。
所以任何声称“跨平台判断网络驱动器”的方案,要么 Windows-only,要么语义错位(比如把挂载点当网络驱动器)。硬要写条件编译,也只应在 Windows 分支里用 GetDriveType + WNetGetConnection 组合。
最容易被忽略的是路径规范化:大小写、斜杠方向、尾部反斜杠缺失都可能导致 PathStripToRoot 失败或 GetDriveType 返回意外值。实际使用前务必先调用 PathCanonicalize 或 std::filesystem::canonical(仅Windows下有效)。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











