\? 附加到文件路径时是啥意思
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 个字符。这种类型的路径由组件组成 用反斜杠分隔,每个不超过返回的值
GetVolumeInformation
的lpMaximumComponentLength
参数 函数(此值通常为 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 个字符的路径名限制,前提是底层文件系统支持长路径和文件名。
【讨论】:
以上是关于\? 附加到文件路径时是啥意思的主要内容,如果未能解决你的问题,请参考以下文章
./configure --prefix=/opt/apache是啥意思