代码之家  ›  专栏  ›  技术社区  ›  kgriffs

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

  •  14
  • kgriffs  · 技术社区  · 17 年前

    我偶然发现了一个c库,用于打开给定Unicode文件名的文件。在打开文件之前,它首先通过前缀“\\?\”将文件名转换为路径。除了增加路径中允许的最大字符数外,还有什么理由这样做吗 this msdn article ?

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

    5 回复  |  直到 16 年前
        1
  •  9
  •   xahtep    17 年前

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

        2
  •  5
  •   itsadok    17 年前

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

    我管理着一个文件服务器,它通常会通过以下方式获取文件 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的文件。同样,前缀允许您和您的脚本处理这些文件。

        3
  •  3
  •   Rob Kennedy    17 年前

    我认为首先要注意的是,“\\?\”不会使路径成为UNC路径。你第二次称之为联合国军司令部时更准确了- 风格 路径。但即便如此,这种相似性也只来自一开始有两个反斜杠。这真的与UNC无关。事实证明,你必须使用 字符,以获取前缀为“\\?\”的UNC路径。

    我认为你有使用这个前缀的全部原因。它提高了您引用的文章中所述的最大长度限制。而且它只适用于Unicode路径;非Unicode路径无法通过使用该前缀来避免限制。

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

        4
  •  3
  •   j_random_hacker    14 年前

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

        5
  •  1
  •   Head Geek    17 年前

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