我公司的一个应用程序传递了路径。现在我们遇到了错误,因为我们得到的路径是这样的:\\?\UNC\server\share\path\file
我对这个语法感到困惑,因为我以前从未见过它。而且据我所知,每个以 \\ 开头的路径已经是 UNC 路径。那么为什么要将其屏蔽为 UNC 路径呢?
经过网上的一些研究,我发现了这些文章:
- https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
- https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
第一篇文章说:
根据需要使用反斜杠作为卷名的一部分,例如,通用命名约定 (UNC) 名称中的“C:\path\file”中的“C:”或“\\server\share\path\file”中的“\\server\share”。
听起来“\\server\share\path\file”已经是有效的 UNC 路径。因此,无需使用其他语法来延长路径长度。
但第二篇文章说:
“\\?\”前缀也可以用于根据通用命名约定 (UNC) 构造的路径。要使用 UNC 指定这样的路径,请使用“\\?\UNC\”前缀。例如,“\\?\UNC\server\share”,其中“server”是计算机的名称,“share”是共享文件夹的名称。这些前缀不用作路径本身的一部分。它们表示路径应以最小的修改传递给系统,这意味着您不能使用正斜杠来表示路径分隔符,或使用句点来表示当前目录,或使用双点来表示父目录。由于您不能将“\\?\”前缀用于相对路径,因此相对路径始终限制为总共最大路径人物。
所以这种奇怪的语法确实是微软指定的。但语法似乎不是受 Windows 支持。我可以使用 \\server\share\path\file 访问任何现有文件,但无法使用 \\?\UNC\server\share\path\file 访问任何文件
这种奇怪的 UNC 语法是否曾经有效或者在较新的 Windows 版本中已被禁用?
答案1
\\?\UNC\server\share\path\file 语法仅对单个文件命令(例如 CreateFile、GetFileAttributesEx 等)有效,并且必需的如果您想访问超出 MAX_PATH 限制的服务器文件,除非您已从问题中的第二个链接设置了注册表项。
不幸的是,某些命令(例如 FindFirstFile)不支持此语法。因此,如果您想列出这样的文件夹,则需要删除此前缀。
我的解决方案是将此语法添加到单个文件访问命令中,并将其从文件浏览器命令中删除。我在相应的 API 调用之前执行此操作。
所以这个问题的答案是:是的,这种语法是有效的,有时是需要的,但并不是每个 WinAPI 命令都支持它。