\\?\意味着什么在文件路径前面

bjj*_*jer 47 windows filepath

我找到了对日志中具有以下格式的文件的引用:

\\?\C:\Path\path\file.log
Run Code Online (Sandbox Code Playgroud)

我找不到对\?\表示顺序的引用.我相信反斜杠之间的部分是指主机名.

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

dir \\?\C:\
Run Code Online (Sandbox Code Playgroud)

而且,结果相同:

dir \\.\C:\
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 是否提到了问号在这种特定路径格式中的含义?
  2. 什么可能以这种格式生成文件路径?

Fer*_*eak 49

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

提取:

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

和:

"\\?\"前缀也可以与根据通用命名约定(UNC)构建路径所用.要使用UNC指定此类路径,请使用"\\?\UNC\"前缀.例如,"\\?\UNC\server\share"其中"server"是计算机"share"的名称,是共享文件夹的名称.这些前缀不会用作路径本身的一部分.它们表明路径应该以最小的修改传递给系统,这意味着您不能使用正斜杠表示路径分隔符,或者表示当前目录的句点,或者表示父目录的双点.由于您不能将"\\?\"前缀与相对路径一起使用,因此相对路径始终限制为总共MAX_PATH字符数.

  • @MichaelBurr:Fritzone忘了引用[文档]中最相关的句子(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx):*"对于文件I/O,路径字符串的'\\?\'前缀告诉Windows API禁用所有字符串解析并将其后面的字符串直接发送到文件系统."*解析包括将正斜杠转换为反斜杠,或解释`. `和`..`伪目录.宽松的路径长度限制仅仅是副作用(尽管是最常用的前缀). (8认同)
  • 迟到的评论,但我没有看到使用此符号的另一个原因是访问没有使用卷 ID 分配驱动器号的磁盘。 (4认同)
  • 哦 - 我知道 Windows API 不喜欢比`MAX_PATH` 长的路径,除非它有特殊的前缀 - 我只是想知道为什么他们不只是将 API 修复为没有前缀的更长路径。我认为这与需要优化缓冲区处理方式以转换为 Unicode 的 API 的 ANSI 版本有关,但我真的不记得了。只是看起来没有必要。 (3认同)
  • 我已经知道了一段时间,但今天阅读这篇文章让我想知道微软的理由是需要特殊的前缀来表示"让我给你一个比'MAX_PATH`字符更长的路径".为什么我传入一个长度超过"MAX_PATH"字符的路径的事实不是一个足够好的指示?我可能不得不在SO上发布这个问题...... (2认同)
  • 因为程序只分配了260个字符的存储空间.如果Windows返回的名称长于此值,则会导致问题.Window的规则来自历史.文件系统不符合这些规则,可以使用Unix约定(虽然Window的程序将无法访问)或任何东西. (2认同)
  • 有谁知道这个“”\\?\”序列是否有名称? (2认同)

IIn*_*ble 5

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

文件的目的\\?\前缀是:

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

如果底层文件系统支持长路径和文件名,则允许使用...在路径名中使用,以及放宽260字符路径名限制.