\? 附加到文件路径时是啥意思

Posted

技术标签:

【中文标题】\\?\ 附加到文件路径时是啥意思【英文标题】:What does \\?\ mean when prepended to a file path\\?\ 附加到文件路径时是什么意思 【发布时间】:2014-02-07 07:01:51 【问题描述】:

我在日志中发现了对具有以下格式的文件的引用:

\\?\C:\Path\path\file.log

我找不到对 \?\ 序列含义的参考。我相信反斜杠之间的部分是指主机名。

例如,在我的 Windows 计算机上,以下工作正常:

dir \\?\C:\

而且,同样的结果也很好:

dir \\.\C:\

问题:

    在这种特定的路径格式中,问号的含义是否有参考? 什么可能会生成这种格式的文件路径?

【问题讨论】:

【参考方案1】:

长篇大论,但如果你在这个领域值得一读:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx

摘录:

Windows API 有许多函数也有 Unicode 版本 允许一个扩展长度的路径,最大总路径长度为 32,767 个字符。这种类型的路径由组件组成 用反斜杠分隔,每个不超过返回的值 GetVolumeInformationlpMaximumComponentLength 参数 函数(此值通常为 255 个字符)。指定一个 扩展长度路径,使用 "\\?\" 前缀。例如, "\\?\D:\very long path".

和:

"\\?\" 前缀也可以与根据以下构造的路径一起使用 通用命名约定 (UNC)。使用指定这样的路径 UNC,使用 "\\?\UNC\" 前缀。例如"\\?\UNC\server\share", 其中"server" 是计算机的名称,"share" 是计算机的名称 共享文件夹。这些前缀不用作路径的一部分 本身。它们表明应该将路径传递给系统 修改最少,这意味着您不能使用 forward 斜杠表示路径分隔符,或句点表示 当前目录,或双点表示父目录。 因为您不能将 "\\?\" 前缀与相对路径一起使用, 相对路径总是被限制为总共 MAX_PATH 个字符。

【讨论】:

我知道这一点已经有一段时间了,但今天读到这让我想知道微软为什么需要特殊前缀来表示“让我给你一个比MAX_PATH 字符长的路径” .为什么我通过的路径长度超过MAX_PATH 字符的事实不能作为一个足够好的指示?我可能不得不将其作为一个问题发布在 SO... 哦 - 我知道 Windows API 不喜欢比 MAX_PATH 更长的路径,除非它有特殊的前缀 - 我只是想知道为什么他们不只是修复 API 更长的时间没有前缀的路径。我认为这与需要优化如何处理缓冲区以转换为 Unicode 的 API 的 ANSI 版本有关,但我真的不记得了。这似乎没有必要。 因为程序只分配了 260 个字符的存储空间。如果 Windows 返回的名称比这长,这将导致问题。 Window 的规则来自历史。文件系统不遵守这些规则,可以使用 Unix 约定(尽管 Window 的程序无法访问)或任何东西。 @MichaelBurr:Fritzone 忘记引用documentation 中最相关的句子“对于文件 I/O,路径字符串的 '\\?\' 前缀告诉 Windows用于禁用所有字符串解析并将其后的字符串直接发送到文件系统的 API。” 解析包括将正斜杠转换为反斜杠,或解释 ... 伪目录。放宽的路径长度限制只是一种副作用(尽管前缀最常用)。 迟到的评论,但我没有看到使用此表示法的另一个原因是访问没有使用其卷 ID 分配驱动器号的磁盘。【参考方案2】:

Windows API 解析文件 I/O 的输入字符串。除其他外,它将/ 转换为\ 作为将名称转换为NT 样式名称或解释... 伪目录的一部分。除了少数例外,Windows API 还将路径名限制为 260 个字符。

\\?\ 前缀的documented 用途是:

对于文件 I/O,路径字符串的“\\?\”前缀告诉 Windows API 禁用所有字符串解析并将其后面的字符串直接发送到文件系统。

这允许在路径名中使用...,并放宽260 个字符的路径名限制,前提是底层文件系统支持长路径和文件名。

【讨论】:

以上是关于\? 附加到文件路径时是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

path是啥意思

导入路径中的 @ 是啥意思?

asp.net中Server.MapPath是啥意思?

./configure --prefix=/opt/apache是啥意思

linux 中 ~/. 是啥意思如题 ~/.local 是怎样一个路径?

就 HTML 文件路径位置而言,“./”(点斜杠)指的是啥?