支持使用 \\?\ 前缀的长路径
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 版本的函数并将
"\\?\"
添加到路径中。
【讨论】:
以上是关于支持使用 \\?\ 前缀的长路径的主要内容,如果未能解决你的问题,请参考以下文章