Lange Pfade [v1.1.31+]

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

  1. Die vom Betriebssystem bereitgestellten Funktionen beschränken Pfade in der Regel auf 259 Zeichen, mit einigen Ausnahmen.
  2. Ein Code für die Behandlung von Pfaden innerhalb des Programms kann sich auf die erste Limitierung stützen, um den Code zu vereinfachen, was effektiv eine weitere 259-Zeichen-Limitierung bedeutet.

Diese Limitierungen werden oft als "MAX_PATH-Limitierungen" bezeichnet, bezogen auf die Konstante MAX_PATH, die den Wert 260 enthält. In der Regel ist ein Zeichen für einen Nullterminator reserviert, somit verbleiben 259 Zeichen für den eigentlichen Pfad.

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

Langer-Pfad-Präfix

Sofern von der intern verwendeten Systemfunktion unterstützt, erhöht das Präfix \\?\ -- z.B. 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. Hierbei ist Vorsicht geboten, da auf diese Weise Pfade entstehen können, auf die "normale" Programme nicht zugreifen können.

Genauer gesagt macht die Normalisierung folgendes:

Um einen Pfad explizit zu normalisieren, übergeben Sie ihn mit der unten definierten Funktion an GetFullPathName, bevor Sie das Präfix voranstellen. 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 ebenfalls mit dieser Funktion normalisiert werden. In diesem Fall wird jedoch nie das Arbeitsverzeichnis verwendet und das Stammverzeichnis ist \\?\ (z.B. 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.

Obwohl 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.

Die folgenden Dinge unterstützen keine langen Pfade aufgrund von Limitierungen der intern verwendeten Systemfunktion(en):

SetWorkingDir und A_WorkingDir unterstützen lange Pfade nur, 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 nicht mehr mit Run gestartet werden. Diese Limitierungen sind vom Betriebssystem vorgegeben.

Es scheint nicht möglich zu sein, 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. Aus diesem Grund wurde das MAX_PATH-Limit für folgende Dinge beibehalten:

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