14

我遇到了 ac 库,用于打开给定 Unicode 文件名的文件。在打开文件之前,它首先通过添加“\\?\”将文件名转换为路径。根据这篇 msdn 文章,除了增加路径中允许的最大字符数之外,还有什么理由这样做吗?

看起来这些“\\?\”路径需要 Windows API 和标准库的 Unicode 版本。

4

5 回答 5

10

是的,就是为了这个目的。但是,如果您决定创建超过 MAX_PATH 长度的路径,您可能会遇到兼容性问题。例如,资源管理器 shell 和命令提示符(至少在 XP 上,我不了解 Vista)无法处理超过该长度的路径,并且会返回错误。

于 2008-12-04T18:32:23.253 回答
5

此方法的最佳用途可能不是创建新文件,而是管理其他人可能已创建的现有文件。

我管理了一个文件服务器,它通常会使用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 的文件。同样,前缀允许您和您的脚本处理这些文件。

于 2008-12-09T09:20:00.760 回答
3

我认为首先要注意的是 "\\?\" 不会使路径成为 UNC 路径。你第二次称它为 UNC风格的路径时更准确。但即便如此,相似之处仅来自于开头有两个反斜杠。跟UNC真的没关系。您必须使用更多字符才能获得带有“\\?\”前缀的 UNC 路径这一事实支持了这一点。

我认为您有使用该前缀的全部理由。如您引用的文章中所述,它提高了最大长度限制。它仅适用于 Unicode 路径;非 Unicode 路径无法通过使用该前缀来避免限制。

需要注意的一件事是,前缀不允许用于相对路径,仅用于绝对路径。您可能需要仔细检查您的 C 库是否符合该限制。

于 2008-12-04T18:42:25.620 回答
3

除了允许更长的路径外,“\\?\”前缀还允许您使用文件和目录名称,如“con”和“aux”。通常 Windows 会将它们解释为老式的 DOS 设备。

于 2012-08-19T18:22:57.833 回答
1

自 1995 年以来我一直在编写 Windows 代码,虽然我知道这个前缀,但我从未找到任何使用它的理由。增加路径长度MAX_PATH似乎是唯一的原因,据我所知,我和我的程序的任何客户都没有这样做过。

于 2008-12-04T18:11:56.120 回答