2008-12-04 83 views
12

我碰到一个c库,用于打开Unicode文件名的文件。在打开文件之前,它首先通过预先添加“\\?\”将文件名转换为路径。根据this msdn article,是否有任何理由这样做,而不是增加路径中允许的最大字符数?在Windows上,何时应使用“\\?\”文件名前缀?

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

+0

除了长度限制之外,它还允许您不受限制地使用文件名中的句号和空格。例如,如果你想要的话,你可以有一个名为`..`的文件, – Antimony 2013-04-24 22:05:07

回答

9

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

1

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

3

我认为首先要注意的一点是,“\\?\”不会使路径的UNC路径。当你将其称为UNC-风格路径时,第二次更准确。但即使如此,相似性只是从一开始就有两个反斜杠。这与UNC无关。这是由于你必须使用甚至更​​多的字符来获得带有“\\?\”前缀的UNC路径。

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

有一点需要注意的是,前缀不允许用于相对路径,只适用于绝对路径。您可能要仔细检查一下,您的C库是否能够遵守该限制。

5

这种方法的最佳方式是可能不是创建新文件,但管理现有的文件,这可能已有其他人创建的。

我管理这经常会得到与path_length > MAX_PATH文件的文件服务器。你看,用户看到这些文件为H:\myfile.txt,但在服务器上它实际上是H:\users\username\myfile.txt。因此,如果用户创建了一个与MAX_PATH字符完全相同的文件,则在服务器上它是MAX_PATH+len("users\username")。 (使用MAX_PATH字符创建文件并不少见,因为当您在Internet Explorer上保存网页时,它会使用页面标题作为文件名,这对于某些页面来说可能很长)。

而且,共享驱动器(通过网络或USB)与Mac或Linux机器,你可以用像CON,PRN或LPT1名的文件发现自己。再说一遍,前缀可以让你和你的脚本处理这些文件。

+1

正确的是,它关闭了比长度检查更多的处理。 (quote) 以最小的修改传递给系统,这意味着您不能使用正斜杠来表示路径分隔符或表示当前目录的句点,或者使用双点来表示父目录。由于您不能在相对路径中使用“\\?\”前缀,因此相对路径始终限制为总共MAX_PATH个字符。 (/ quote) – 2009-12-09 00:24:02

3

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

相关问题