Windows 默认的 260 字符路径限制(MAX_PATH)其实是个历史遗留的“约定”,并非系统 API 硬编码死锁。从 Windows 10 1607 版本开始,系统层面已经支持长路径,但想要真正绕过这个限制,得同时满足两个条件:一是使用 \\?\ 前缀加上绝对宽字符路径,二是在系统组策略或注册表中启用长路径支持。如果只满足其中一个,哪怕路径本身合法,像 CreateFileAstd::filesystem::exists 这类函数也会直接甩给你一个 ERROR_FILENAME_EXCED_RANGE(错误码 206)。

c++如何处理Windows下路径名超过260字符的限制_UNC前缀【详解】

Windows长路径限制的本质是什么

Windows 默认的 260 字符路径限制(MAX_PATH)不是 API 硬编码,而是历史遗留的用户态约定。从 Windows 10 1607 起,系统已支持长路径,但需两个前提同时满足:\\?\ 前缀 + 系统组策略/注册表启用。否则哪怕路径本身合法,CreateFileAstd::filesystem::exists 等都会直接返回 ERROR_FILENAME_EXCED_RANGE(错误码 206)。

关键点在于:C++ 标准库(如 std::filesystem)在 MSVC 实现中默认不自动加 \\?\,它走的是普通 Win32 路径解析逻辑;而原生 Win32 API 只要传入带 \\?\ 的宽字符路径(L"\\\\?\\C:\\..."),就能绕过 260 限制——前提是目标目录存在且权限足够。

std::filesystem 安全处理长路径的实操方式

MSVC 19.29+(VS 2019 16.11+)开始,std::filesystem 对长路径的支持仍依赖运行时是否开启全局长路径支持,不能仅靠加前缀。实际使用中建议:

示例:

std::filesystem::path p = std::filesystem::path(L"\\\\?\\") / L"C:\\Users\\a\\b\\c\\...\\deep\\file.txt";
if (std::filesystem::exists(p)) {
    auto f = std::ifstream(p, std::ios::binary);
}

Win32 API 层面绕过限制的必要条件

直接调用 CreateFileWFindFirstFileW 等函数时,\\?\ 前缀是唯一可靠方式,但有严格格式要求:

为什么加了 \\?\ 还是报错 ERROR_PATH_NOT_FOUND

这个错误常被误判为“长路径没生效”,实际多数情况与前缀无关:

真正棘手的是:某些第三方库(如 Boost.Filesystem 旧版、Qt 5.x 的 QDir)内部硬编码了 MAX_PATH 缓冲区,即使你传入 \\?\ 路径,它们也会先用 GetFullPathNameW 做预处理并截断——这种问题只能换库或绕开封装直调 Win32。

本文转载于:https://www.php.cn/faq/2345549.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。