Maximale Längenbeschränkung für Pfade

In der Windows-API (mit einigen Ausnahmen, die in den folgenden Absätzen erläutert werden) beträgt die maximale Länge für einen Pfad MAX_PATH, die als 260 Zeichen definiert ist. Ein lokaler Pfad ist in der folgenden Reihenfolge strukturiert: Laufwerkbuchstabe, Doppelpunkt, umgekehrter Schrägstrich, durch umgekehrte Schrägstriche getrennte Namenskomponenten und ein abschließendes NULL-Zeichen. Beispielsweise ist der maximale Pfad auf Laufwerk D "D:\some 256-Zeichen Pfadzeichenfolge<NUL>", wobei "<NUL>" das unsichtbare null-Endzeichen für die aktuelle Systemcodepage darstellt. (Die Zeichen <> werden hier aus Gründen der visuellen Übersichtlichkeit verwendet und können nicht Teil einer gültigen Pfadzeichenfolge sein.)

Diese Einschränkung kann beispielsweise erreicht werden, wenn Sie ein Git-Repository mit langen Dateinamen in einen Ordner klonen, der selbst einen langen Namen hat.

Hinweis

Datei-E/A-Funktionen in der Windows-API konvertieren "/" in "\" als Teil der Konvertierung des Namens in einen Namen im NT-Format, außer bei Verwendung des Präfixes "\\?\", wie in den folgenden Abschnitten beschrieben.

Die Windows-API verfügt über viele Funktionen, die auch über Unicode-Versionen verfügen, um einen Pfad mit erweiterter Länge für eine maximale Gesamtpfadlänge von 32.767 Zeichen zuzulassen. Dieser Pfadtyp besteht aus Komponenten, die durch umgekehrte Schrägstriche getrennt sind, jeweils bis zu dem Wert, der im lpMaximumComponentLength-Parameter der GetVolumeInformation-Funktion zurückgegeben wird (dieser Wert beträgt in der Regel 255 Zeichen). Um einen Pfad mit erweiterter Länge anzugeben, verwenden Sie das Präfix "\\?\". Beispiel: "\\?\D:\very long path".

Hinweis

Der maximale Pfad von 32.767 Zeichen ist ungefähr, da das Präfix "\\?\" vom System zur Laufzeit auf eine längere Zeichenfolge erweitert werden kann, und diese Erweiterung gilt für die Gesamtlänge.

Das Präfix "\\?\" kann auch für Pfade verwendet werden, die gemäß der Universal Naming Convention (UNC) erstellt wurden. Um einen solchen Pfad mithilfe von UNC anzugeben, verwenden Sie das Präfix "\\?\UNC\". Beispiel: "\\?\UNC\server\share", wobei "server" der Name des Computers und "share" der Name des freigegebenen Ordners ist. Diese Präfixe werden nicht als Teil des Pfads selbst verwendet. Sie geben an, dass der Pfad mit minimaler Änderung an das System übergeben werden soll. Dies bedeutet, dass Sie keine Schrägstriche zum Darstellen von Pfadtrennzeichen oder einen Punkt zur Darstellung des aktuellen Verzeichnisses oder doppelte Punkte zum Darstellen des übergeordneten Verzeichnisses verwenden können. Da Sie das Präfix "\\?\" nicht mit einem relativen Pfad verwenden können, sind relative Pfade immer auf eine Gesamtanzahl von MAX_PATH Zeichen beschränkt.

Es ist nicht erforderlich, eine Unicode-Normalisierung für Pfad- und Dateinamenzeichenfolgen zur Verwendung durch die Windows-Datei-E/A-API-Funktionen durchzuführen, da das Dateisystem Pfad- und Dateinamen als undurchsichtige Abfolge von WCHAR-Sbehandelt. Jede Normalisierung, die Für Ihre Anwendung erforderlich ist, sollte in diesem Sinne ausgeführt werden, und zwar außerhalb von Aufrufen verwandter Windows-Datei-E/A-API-Funktionen.

Wenn Sie eine API zum Erstellen eines Verzeichnisses verwenden, kann der angegebene Pfad nicht so lang sein, dass Sie keinen Dateinamen der Version 8.3 anfügen können (d. h. der Verzeichnisname darf MAX_PATH minus 12 nicht überschreiten).

Die Shell und das Dateisystem haben unterschiedliche Anforderungen. Es ist möglich, einen Pfad mit der Windows-API zu erstellen, den die Shell-Benutzeroberfläche nicht richtig interpretieren kann.

Aktivieren von langen Pfaden in Windows 10, Version 1607 und höher

Ab Windows 10 Version 1607 wurden MAX_PATH Einschränkungen aus allgemeinen Win32-Datei- und Verzeichnisfunktionen entfernt. Sie müssen sich jedoch für das neue Verhalten anmelden.

Um das neue Verhalten für lange Pfade zu aktivieren, müssen die beiden folgenden Bedingungen erfüllt sein:

  • Der Registrierungsschlüssel Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD) muss vorhanden sein und auf 1 festgelegt werden. Der Wert des Schlüssels wird vom System (pro Prozess) nach dem ersten Aufruf einer betroffenen Win32-Datei oder Verzeichnisfunktion zwischengespeichert (die Liste der Funktionen finden Sie unten). Der Registrierungsschlüssel wird während der Lebensdauer des Prozesses nicht erneut geladen. Damit alle Apps im System den Wert des Schlüssels erkennen, ist möglicherweise ein Neustart erforderlich, da einige Prozesse möglicherweise gestartet wurden, bevor der Schlüssel festgelegt wurde.

Sie können diesen Code auch in eine .reg Datei kopieren, die dies für Sie festlegen kann, oder den PowerShell-Befehl aus einem Terminalfenster mit erhöhten Rechten verwenden:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

Hinweis

Dieser Registrierungsschlüssel kann auch über Gruppenrichtlinie unter Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long pathsgesteuert werden.

  • Das Anwendungsmanifest muss auch das longPathAware -Element enthalten.

    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
            <ws2:longPathAware>true</ws2:longPathAware>
        </windowsSettings>
    </application>
    

Dies sind die Verzeichnisverwaltungsfunktionen, die keine MAX_PATH Einschränkungen mehr haben, wenn Sie sich für langes Pfadverhalten entscheiden: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Dies sind die Dateiverwaltungsfunktionen, die keine MAX_PATH Einschränkungen mehr haben, wenn Sie sich für lange Pfade entscheiden: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.