支持使用 \\?\ 前缀的长路径

Posted

技术标签:

【中文标题】支持使用 \\\\?\\ 前缀的长路径【英文标题】:Support for long paths using \\?\ prefix支持使用 \\?\ 前缀的长路径 【发布时间】:2022-01-22 02:33:06 【问题描述】:

根据here 的规定,可以在Windows 上使用绝对路径而没有MAX_PATH 长度限制。

但是我注意到以 \\?\ 开头的路径在某些旧版本的 Windows 中不起作用。

我需要检测哪个版本(例如,使用here 描述的功能之一)来帮助我的软件决定使用\\?\ 路径?

【问题讨论】:

这能回答你的问题吗? How to programmatically check if the current process is long path aware on Windows?。可能与 this 一起使用,它表示它是 Windows 10、1607(链接的问答也是如此)。 `\\?\` 前缀仅在调用 Unicode API 时启用长路径支持。据我所知,这已经存在了几十年。你在调用 Unicode API 吗? 另外,检测 Windows 版本不是编写功能自适应代码的方式。只需调用 API 并响应报告的错误(如果有)。 如果您使用名称以 \\?\ 开头的 CreateFileW - 始终支持长路径。在任何版本的 Windows 中。即使在 xp 或 2000 中。所以你甚至不需要检查任何东西。当然如果使用本机 api(即 NtOpenFile) - 当然总是支持并且也可能使用相对名称 如果考虑性能,为什么要使用非Unicode API?所做的只是在两个方向上增加编码开销。这听起来还没有定论, 【参考方案1】:

如果您在 unicode 路径中使用 \\?\ 前缀 - 在任何版本的 Windows(甚至是 win2000 和 xp)中始终支持长路径。关于支持长路径的问题 - 只影响不以\\?\开头的其他路径类型,例如c:\*

来自Maximum Path Length Limitation

Windows API 有许多函数,它们也有 Unicode 版本,以允许最大总路径长度为 32,767 个字符。 ...要指定扩展长度的路径,请使用 "\\?\" 前缀。例如,"\\?\D:\very long path"

通常在任何单独的函数文档中直接说明 \\?\ 前缀(如果此 api 支持 - 文件 I/O 函数始终支持此前缀,而 shell api - 从不)

例如来自GetFileAttributesW

要将此限制扩展到 32,767 个宽字符,请调用函数的 Unicode 版本 (GetFileAttributesW),并将 "\\?\" 添加到 路径。

CreateFileW 上也一样……

要将此限制扩展到 32,767 个宽字符,请使用此 Unicode 版本的函数并将 "\\?\" 添加到路径中。

【讨论】:

以上是关于支持使用 \\?\ 前缀的长路径的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用路径中的长 ID 是啥?

动态链接 - 域和路径前缀正在发布。请在一个月后重试

使用路径、路径前缀或路径模式的意图过滤器

使用路径前缀规则时如何用 Traefik 重写路径?

nginx启动,重启,重新加载,以及前缀路径设置

有没有办法在 macOS 中解决 git repo 中的长路径的“PATH_MAX”?