在 Windows 上,啥时候应该使用“\\\\?\\”文件名前缀?
Posted
技术标签:
【中文标题】在 Windows 上,啥时候应该使用“\\\\\\\\?\\\\”文件名前缀?【英文标题】:On Windows, when should you use the "\\\\?\\" filename prefix?在 Windows 上,什么时候应该使用“\\\\?\\”文件名前缀? 【发布时间】:2010-09-25 09:18:33 【问题描述】:我遇到了一个 c 库,用于打开给定 Unicode 文件名的文件。在打开文件之前,它首先通过添加“\\?\”将文件名转换为路径。除了根据this msdn article 增加路径中允许的最大字符数之外,还有什么理由这样做吗?
看起来这些“\\?\”路径需要 Unicode 版本的 Windows API 和标准库。
【问题讨论】:
除了长度限制外,它还允许您在文件名中使用句点和空格而不受限制。例如,如果你愿意,你可以有一个名为..
的文件,
【参考方案1】:
是的,就是为了这个目的。但是,如果您决定创建超过 MAX_PATH 长度的路径,您可能会遇到兼容性问题。例如,资源管理器 shell 和命令提示符(至少在 XP 上,我不了解 Vista)无法处理超过该长度的路径,并且会返回错误。
【讨论】:
【参考方案2】:此方法的最佳用途可能不是创建新文件,而是管理其他人可能已创建的现有文件。
我管理了一个文件服务器,它通常会使用path_length > MAX_PATH
获取文件。你看,用户看到的文件是H:\myfile.txt
,但在服务器上它实际上是H:\users\username\myfile.txt
。因此,如果用户创建了一个完全包含MAX_PATH
字符的文件,那么在服务器上它就是MAX_PATH+len("users\username")
。
(创建包含 MAX_PATH 字符的文件并不少见,因为当您在 Internet Explorer 上保存网页时,它使用页面标题作为文件名,这对于某些页面可能很长)。
此外,与 Mac 或 Linux 机器共享驱动器(通过网络或 USB),您会发现自己拥有名称为 con、prn 或 lpt1 的文件。同样,前缀允许您和您的脚本处理这些文件。
【讨论】:
对,它会关闭更多的处理,而不仅仅是长度检查。 (quote) 以最小的修改传递给系统,这意味着您不能使用正斜杠来表示路径分隔符,或者使用句点来表示当前目录,或者使用双点来表示父目录。因为您不能将“\\?\”前缀与相对路径一起使用,所以相对路径总是限制为总共 MAX_PATH 字符。 (/quote)【参考方案3】:我认为首先要注意的是 "\\?\" 不会使路径成为 UNC 路径。当您将其称为 UNC-style 路径时,您第二次更准确。但即便如此,相似之处仅来自于开头有两个反斜杠。跟UNC真的没关系。您必须使用 更多 个字符来获得带有“\\?\”前缀的 UNC 路径这一事实支持了这一点。
我认为您有使用该前缀的全部理由。如您引用的文章中所述,它提高了最大长度限制。它仅适用于 Unicode 路径;非 Unicode 路径无法通过使用该前缀来避免限制。
需要注意的是,相对路径不允许使用前缀,仅用于绝对路径。您可能需要仔细检查您的 C 库是否符合该限制。
【讨论】:
【参考方案4】:除了允许更长的路径外,“\\?\”前缀还允许您使用文件和目录名称,例如“con”和“aux”。通常 Windows 会将它们解释为老式的 DOS 设备。
【讨论】:
【参考方案5】:自 1995 年以来我一直在编写 Windows 代码,虽然我知道该前缀,但我从未找到任何使用它的理由。增加路径长度超过MAX_PATH
似乎是唯一的原因,据我所知,我和我的程序的任何客户都没有这样做过。
【讨论】:
以上是关于在 Windows 上,啥时候应该使用“\\\\?\\”文件名前缀?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 线程:啥时候应该使用 InterlockedExchangeAdd()?