Grundsätzlich sind Programme von zwei Arten von Pfadlängenlimitierungen betroffen:
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 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:
\\?\
beginnt. Es gibt jedoch einige Systemfunktionen, die dieses Präfix (oder generell lange Pfade) nicht unterstützen. Weitere Informationen finden Sie unter Bekannte Einschränkungen.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:
verz\datei.erw
, \datei.erw
und C:datei.erw
auf (man beachte den fehlenden Schrägstrich).\..
und \.
auf./
mit \
ersetzt und redundante Trennzeichen entfernt.verz.\datei
) oder Leerzeichen und Punkte am Ende (verz\dateiname . .
).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") buf := Buffer(cc*2) DllCall("GetFullPathName", "str", Pfad, "uint", cc, "ptr", buf, "ptr", 0) return StrGet(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).
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.