【问题标题】:On Windows, when should you use the "\\\\?\\" filename prefix?在 Windows 上,什么时候应该使用“\\\\?\\”文件名前缀?
【发布时间】:2010-09-25 09:18:33
【问题描述】:

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

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

【问题讨论】:

  • 除了长度限制外,它还允许您在文件名中使用句点和空格而不受限制。例如,如果你愿意,你可以有一个名为 .. 的文件,

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


【解决方案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 似乎是唯一的原因,据我所知,我和我的程序的任何客户都没有这样做过。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2011-04-15
          • 2017-04-10
          • 2012-03-19
          • 2018-05-12
          相关资源
          最近更新 更多