在Windows上,何时应该使用“\\\\?\\”文件名前缀?

时间:2008-12-04 17:58:55

标签: c++ winapi unicode filenames max-path

我遇到了一个用于打开带有Unicode文件名的文件的c库。在打开文件之前,它首先通过前缀“\\?\”将文件名转换为路径。除this msdn article之外,是否有任何理由除了增加路径中允许的最大字符数外?

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

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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的文件。同样,前缀允许您和您的脚本处理这些文件。

答案 2 :(得分:3)

我认为首先要注意的是“\\?\”不会使路径成为UNC路径。第二次将其称为UNC- 样式路径时,您会更准确。但即使这样,相似性也只来自于开始时有两个反斜杠。这与UNC无关。这是因为您必须使用甚至更多字符来获取带有“\\?\”前缀的UNC路径。

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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