在 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()?

MAUI 和 Uno 平台有啥区别?

我啥时候应该在课堂上使用“this”?

我啥时候应该在 NavLink 上使用 Link?

我啥时候应该在 django 模型字段上使用 null=False

我啥时候应该在“class”上使用“className”,反之亦然?