当 \\?\ 前缀出现在文件路径前时,它是什么意思?

93

我在日志中找到了一个文件的引用,其格式如下:

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

我无法找到关于 \?\ 序列的参考文献。我相信反斜杠之间的部分是指主机名。

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

dir \\?\C:\

同时,具有相同的结果也是可以的:

dir \\.\C:\

问题:

  1. 在这个特定的路径格式中,问号表示什么有参考资料吗?
  2. 可能会生成这种格式的文件路径的原因是什么?
2个回答

89
如果您从事这个领域,这篇长文很值得阅读:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx 提取:
Windows API有许多函数还有Unicode版本,可允许最大总路径长度为32,767个字符的扩展长度路径。这种路径由用反斜杠分隔的组件组成,每个组件的长度最多为GetVolumeInformation函数的lpMaximumComponentLength参数返回的值(通常为255个字符)。要指定扩展长度路径,请使用“\\?”前缀。例如,“\\?\D:\very long path”。
并且:
“\\?”前缀也可用于根据通用命名约定(UNC)构建的路径。要使用UNC指定此类路径,请使用“\\?\UNC\”前缀。例如,“\\?\UNC\server\share”,其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不作为路径本身的一部分使用。它们表示该路径应以最小修改方式传递给系统,这意味着您不能使用正斜杠表示路径分隔符,或使用句点表示当前目录,或使用双点表示父目录。因为您无法在相对路径中使用“\\?”前缀,所以相对路径总长度始终限制为MAX_PATH个字符。

21
我知道这件事已经有一段时间了,但是今天阅读到这篇文章让我想知道微软需要特殊前缀来表示“让我给你一个超过MAX_PATH字符的路径”的理由是什么。为什么我传递一个长度超过 MAX_PATH 字符的路径并不足够说明呢?我可能需要在SO上发布这个问题…… - Michael Burr
3
哦 - 我明白了,Windows API不喜欢超过MAX_PATH字符的路径,除非路径有特殊前缀 - 我只是想知道为什么他们不直接修复API以允许没有前缀的更长路径。我认为这与API的ANSI版本需要优化如何处理缓冲区以进行Unicode转换有关,但我不太记得了。这似乎很不必要。 - Michael Burr
4
由于程序只分配了260个字符的存储空间,如果Windows返回超过这个长度的名称将会出现问题。Windows规则源于历史原因。文件系统不遵循这些规则,可以使用Unix惯例(虽然Windows程序无法访问)或任何其他东西。 - user4971703
30
Fritzone忘了引用文档中最相关的句子:“对于文件I/O,路径字符串前缀“\?\”告诉Windows API禁用所有字符串解析,并将跟随其后的字符串直接发送到文件系统。”解析包括将正斜杠翻译成反斜杠或解释“.”和“..”伪目录。放宽的路径长度限制只是一个副作用(尽管这是该前缀最常用的用途之一)。 - IInspectable
6
晚了一步,但我还没有看到提到使用这种符号的另一个原因,那就是使用卷标识别符来访问没有分配驱动器字母的磁盘。 - kilkenny
显示剩余4条评论

19

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

文档中描述的\\?\前缀的目的是:

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

除了其他操作外,这允许在路径名中使用原本被保留的符号(如...)。退出任何翻译,系统不再需要维护内部缓冲区,并且可以取消260个字符的任意限制(只要底层文件系统支持它)。请注意,这不是\\?\前缀的目的,而是一个推论,即使前缀主要用于其推论。


为什么不直接编辑另一个答案并添加这一部分呢? - David Balažic
@dav 我无法编辑其他提议的答案,否则它会变成完全不同的内容。那个答案假设放松路径限制是拥有这个特定前缀的唯一原因,并且完全忽略了该前缀的实际目的。我应该更新这个答案,包括放松路径限制只是一个巧合的推论。 - IInspectable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接