长路径

一般来说, 程序受到两种路径长度限制的影响:

  1. 操作系统提供的函数通常将路径限制为 259 个字符, 也有一些例外.
  2. 程序内处理路径的代码可能依赖于第一个限制来简化代码, 从而在事实上设置了另一个 259 个字符的限制.

这些限制通常被称为 "MAX_PATH 限制", 常量 MAX_PATH, 其值为 260. 这允许驱动器字母, 冒号和斜杠(C:\), 单个文件或目录名的最大长度(255 个字符), 和一个空终止符.

AutoHotkey 在大多数情况下删除了第二种类型, 这使得脚本可以围绕第一种类型工作. 有两种方法可以做到这一点:

长路径前缀

如果底层系统函数支持, \\?\ 前缀 -- 例如, \\?\C:\My Folder -- 将限制增加到 32,767 个字符. 但是, 它通过跳过路径规范化来实现这一点. 路径的某些元素通常会被规范化删除或更改, 但它们会成为文件实际路径的一部分. 必须小心, 因为这允许创建 "正常" 程序无法访问的路径.

特别是, 规范化:

在应用前缀之前, 可以通过下面定义的函数将路径传递给 GetFullPathName, 从而显式地规范化路径. 例如:

MsgBox "\\?\" NormalizePath("..\file.ext")
NormalizePath(path) {
    cc := DllCall("GetFullPathName", "str", path, "uint", 0, "ptr", 0, "ptr", 0, "uint")
    buf := Buffer(cc*2)
    DllCall("GetFullPathName", "str", path, "uint", cc, "ptr", buf, "ptr", 0)
    return StrGet(buf)
}

带有 \\?\ 前缀的路径也可以被这个函数规范化. 但是, 在这种情况下, 永远不会使用工作目录, 而根目录是 \\?\(例如, \\?\C:\.. 解析为 \\?\, 而 C:\.. 解析为 C:\).

已知限制

尽管路径本身不再限制为 259 个字符, 但是每个部分(文件或目录名) 也不能超过文件系统施加的硬限制(通常为 255 个字符).

由于底层系统函数的限制, 下面这些不支持长路径:

仅在 Windows 10 启用长路径感知时, SetWorkingDirA_WorkingDir 才支持长路径, 因为无法使用 \\?\ 前缀. 如果工作目录长度超过 MAX_PATH, 则无法使用 Run 来启动程序. 这些限制是由操作系统强加的.

似乎无法运行完整路径超过 MAX_PATH 的可执行文件. 在这种情况下, 就不可能完全测试旨在支持更长的可执行路径的任何更改. 因此, 已为以下各项保留了 MAX_PATH 限制:

错误消息中显示的长 #Include 路径可以任意截断.