ロングパス

一般的に、プログラムは2種類のパス長制限の影響を受ける:

  1. オペレーティング・システムが提供する関数は、いくつかの例外を除き、通常パスを259文字に制限している。
  2. プログラム内でパスを扱うコードは、コードを単純化するために最初の制限に依存する可能性があり、事実上、別の259文字の制限を置くことになる。

これらの制限は、値260を持つ定数MAX_PATHにちなんで、しばしば「MAX_PATH制限」と呼ばれる。一般的に1文字はヌルターミネーターとして予約され、259文字が実際のパスに残される。

AutoHotkeyはほとんどの場合、2番目の種類を削除し、スクリプトが1番目の種類を回避できるようにします。これには2つの方法がある:

ロング・パスのプレフィックス

基礎となるシステム機能でサポートされている場合、例えば\\?\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文字)を超えることはできません。

これらは、基礎となるシステム機能の制限により、長いパスをサポートしていない:

SetWorkingDirA_WorkingDirは、\\?\接頭辞が使用できないため、Windows 10のロング・パス認識が有効な場合にのみロング・パスに対応します。作業ディレクトリがMAX_PATHを超えると、Runでプログラムを起動できなくなる。これらの制限はOSによって課される。

MAX_PATHを超えるフルパスで実行ファイルを実行することはできないようです。そうなると、より長い実行可能パスをサポートすることを目的とした変更を完全にテストすることはできない。そのため、MAX_PATHの制限は以下のように残されている:

エラーメッセージに表示される長い#Includeパスは、任意に切り捨てられる可能性があります。