Lange Pfade [v1.1.31+]

Grundsätzlich sind Programme von zwei Arten von Pfadlängenlimitierungen betroffen:

  1. Die vom Betriebssystem bereitgestellten Funktionen beschränken die Pfade in der Regel auf 259 Zeichen, mit einigen Ausnahmen.
  2. Code für den Umgang mit Pfaden innerhalb des Programms kann sich auf die erste Limitierung verlassen, um den Code zu vereinfachen, was zu einer weiteren 259-Zeichen-Limitierung führt.

Diese Limitierungen werden oft als "MAX_PATH-Limitierungen" bezeichnet; dies bezieht sich auf die Konstante MAX_PATH, die den Wert 260 enthält. Dies ermöglicht für den Laufwerksbuchstaben, gefolgt von einem Doppelpunkt und einem Schrägstrich (C:\), eine einzelne Datei oder einen Verzeichnisnamen mit maximaler Länge (255 Zeichen), und einen Null-Terminator.

AutoHotkey [v1.1.31+] (außer ANSI-Versionen) beseitigt in den meisten Fällen die zweite Art von Limitierung, damit das Skript die erste Art von Limitierung umgehen kann. Es gibt zwei Wege, um das zu erreichen:

Langer-Pfad-Präfix

Sofern von der internen Systemfunktion unterstützt, erhöht das Präfix \\?\ -- zum Beispiel in \\?\C:\Mein Ordner -- das Limit auf 32767 Zeichen. Allerdings wird dabei die Pfadnormalisierung übersprungen. Einige Elemente des Pfades, die normalerweise durch eine Normalisierung entfernt oder geändert würden, werden stattdessen Teil des eigentlichen Pfades der Datei. Dabei ist Vorsicht geboten, denn dies kann Erstellung von Pfaden ermöglichen, auf die "normale" Programme nicht zugreifen können.

Genauer gesagt macht die Normalisierung Folgendes:

Um ein Pfad explizit zu normalisieren, können Sie ihn an GetFullPathName über die unten definierte Funktion übergeben, bevor das Präfix angewendet wird. Zum Beispiel:

MsgBox % "\\?\" PfadNormalisieren("..\datei.erw")
PfadNormalisieren(Pfad) {
    cc := DllCall("GetFullPathName", "str", Pfad, "uint", 0, "ptr", 0, "ptr", 0, "uint")
    VarSetCapacity(buf, cc*2)
    DllCall("GetFullPathName", "str", Pfad, "uint", cc, "str", buf, "ptr", 0)
    return buf
}

Ein Pfad mit dem Präfix \\?\ kann auch mit dieser Funktion normalisiert werden. In diesem Fall wird jedoch das Arbeitsverzeichnis nie verwendet, und das Stammverzeichnis ist \\?\ (zum Beispiel wird \\?\C:\.. in \\?\ aufgelöst, während C:\.. in C:\ aufgelöst wird).

Bekannte Einschränkungen

ANSI-Versionen von AutoHotkey unterstützen keine langen Pfade.

Auch wenn der Pfad selbst nicht auf 259 Zeichen limitiert ist, kann jede Komponente (Datei- oder Verzeichnisname) das vom Dateisystem vorgegebene harte Limit (normalerweise 255 Zeichen) nicht überschreiten.

Folgende AutoHotkey-Elemente unterstützen aufgrund der verwendeten Systemfunktion(en) keine langen Pfade:

SetWorkingDir und A_WorkingDir unterstützen nur lange Pfade, wenn die entsprechende Einstellung in Windows 10 aktiviert ist, da das Präfix \\?\ nicht verwendet werden kann. Wenn das Arbeitsverzeichnis MAX_PATH überschreitet, können Programme mit Run nicht mehr gestartet werden. Diese Limitierungen sind vom Betriebssystem vorgegeben.

Es ist scheinbar nicht möglich, eine EXE-Datei auszuführen, deren vollständiger Pfad MAX_PATH überschreitet. In diesem Fall ist es nicht möglich, Änderungen vollständig zu testen, die auf die Unterstützung längerer Pfade von EXE-Dateien abzielen. Daher wurden das MAX_PATH-Limit für folgende Dinge beibehalten:

Lange #Include-Pfade, die in Fehlermeldungen angezeigt werden, können willkürlich gekürzt werden.