Maximale Längenbeschränkung für Pfade

In der Windows-API (mit einigen Ausnahmen in den folgenden Absätzen) ist 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: Laufwerkbuchstaben, Doppelpunkt, Umgekehrter Schrägstrich, Namenkomponenten getrennt durch umgekehrte Schrägstriche und ein beendetes Nullzeichen. Der maximale Pfad auf Laufwerk D lautet beispielsweise "D:\some 256-zeichen path string<NUL>", wobei "<NUL>" das unsichtbare endende Nullzeichen für die aktuelle Systemcodepage darstellt. (Die Zeichen <> werden hier für visuelle Klarheit verwendet und können nicht Teil einer gültigen Pfadzeichenfolge sein.)

Beispielsweise können Sie diese Einschränkung erreichen, wenn Sie ein Git-Repo klonen, das lange Dateinamen in einem Ordner enthält, der sich selbst über einen langen Namen verfügt.

Hinweis

Datei-I/O-Funktionen in der Windows-API konvertieren "/" in "\" als Teil des Konvertierens des Namens in einen NT-Formatvorlagennamen, außer wenn das Präfix "\\?\" verwendet wird, wie in den folgenden Abschnitten beschrieben.

Die Windows-API verfügt über viele Funktionen, die auch Unicode-Versionen haben, um einen erweiterten Pfad 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 zum wert, der im lpMaximumComponentLength-Parameter der GetVolumeInformation-Funktion zurückgegeben wird (dieser Wert ist häufig 255 Zeichen). Um einen erweiterten Pfad anzugeben, verwenden Sie das Präfix "\\?\". Beispiel: "\\\D:\sehr langer Pfad".

Hinweis

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

Das Präfix "\\?\" kann auch mit Pfaden verwendet werden, die gemäß der universellen Benennungskonvention (UNC) erstellt wurden. Um einen solchen Pfad mithilfe von UNC anzugeben, verwenden Sie das Präfix "\\\?\UNC\". Beispielsweise ist "\\\?\UNC\server\share", wobei "server" der Name des Computers und "Freigabe" der Name des freigegebenen Ordners ist. Diese Präfixe werden nicht als Teil des Pfads selbst verwendet. Sie weisen darauf hin, dass der Pfad mit minimaler Änderung an das System übergeben werden soll. Dies bedeutet, dass Sie schräge Schrägstriche nicht verwenden können, um Pfadtrennzeichen darzustellen, oder einen Punkt, der das aktuelle Verzeichnis darstellt, oder doppelte Punkte, um das übergeordnete Verzeichnis darzustellen. Da Sie das Präfix "\\?\" nicht mit einem relativen Pfad verwenden können, sind relative Pfade immer auf eine Summe von MAX_PATH Zeichen beschränkt.

Es muss keine Unicode-Normalisierung für Pfad- und Dateinamenzeichenfolgen für die Verwendung durch die Windows-Datei-I/O-API-Funktionen ausgeführt werden, da das Dateisystem Pfad- und Dateinamen als undurchsichtige Sequenz von WCHARs behandelt. Jede Normalisierung, die Ihre Anwendung erfordert, sollte mit dieser Einstellung ausgeführt werden, externe Aufrufe für verwandte Windows-Datei-I/O-API-Funktionen.

Wenn Sie eine API zum Erstellen eines Verzeichnisses verwenden, kann der angegebene Pfad nicht so lange sein, dass Sie keinen 8.3-Dateinamen anfügen können (das heißt, der Verzeichnisname darf nicht MAX_PATH minus 12 überschreiten).

Die Shell und das Dateisystem haben unterschiedliche Anforderungen. Es ist möglich, einen Pfad mit der Windows-API zu erstellen, über den die Shell-Benutzeroberfläche nicht ordnungsgemäß interpretiert werden 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 des langen Pfads zu aktivieren, müssen beide der 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 (siehe unten für die Liste der Funktionen). Der Registrierungsschlüssel wird während der Lebensdauer des Prozesses nicht neu geladen. Damit alle Apps im System den Wert des Schlüssels erkennen können, 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 gesteuert werden.Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths

  • 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 nicht mehr über MAX_PATH Einschränkungen verfügen, wenn Sie sich für ein langes Pfadverhalten entscheiden: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Dies sind die Dateiverwaltungsfunktionen, die nicht mehr über MAX_PATH Einschränkungen verfügen, wenn Sie sich für ein langes Pfadverhalten 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.