Maximale Längenbeschränkung für Pfade

In der Windows-API (mit einigen Ausnahmen, die in den folgenden Absätzen erläutert werden) 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: Laufwerkbuchstabe, Doppelpunkt, umgekehrter Schrägstrich, durch umgekehrte Schrägstriche getrennte Namenskomponenten und ein abschließendes NULL-Zeichen. Der maximale Pfad auf Laufwerk D ist z. B. "D: \ einige 256-Zeichen Pfadzeichenfolge < NUL > ", wobei " < NUL > " das unsichtbare abschließende NULL-Zeichen für die aktuelle Systemcodepage darstellt. (Die Zeichen < > werden hier zur visuellen Übersichtlichkeit verwendet und können nicht Teil einer gültigen Pfadzeichenfolge sein.)

Diese Einschränkung kann beispielsweise auftreten, 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 wenn das Präfix " ? " verwendet wird, \ \ 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 normalerweise 255 Zeichen). Um einen Pfad mit erweiterter Länge 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 " \ \ ? " 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 \ mit Pfaden verwendet werden, die gemäß der Universal Naming Convention (UNC) erstellt wurden. Um einen solchen Pfad mit unc anzugeben, verwenden Sie " \ \ ? \ UNC \ "-Präfix. Beispiel: " \ \ ? \ \ \ UNC-Serverfreigabe", 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 geben an, dass der Pfad mit minimaler Änderung an das System übergeben werden soll. Dies bedeutet, dass Sie keine Schrägstriche verwenden können, um Pfadtrennzeichen oder einen Punkt zur Darstellung des aktuellen Verzeichnisses oder doppelte Punkte für das übergeordnete Verzeichnis darzustellen. 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 durchzuführen, die von den Windows Datei-E/A-API-Funktionen verwendet werden, da das Dateisystem Pfad- und Dateinamen als nicht transparente Sequenz von WCHAR-s behandelt. Jede Normalisierung, die Ihre Anwendung erfordert, sollte unter Berücksichtigung dieser Berücksichtigung außerhalb aller Aufrufe verwandter Windows Datei-E/A-API-Funktionen durchgeführt werden.

Wenn Sie eine API zum Erstellen eines Verzeichnisses verwenden, kann der angegebene Pfad nicht so lang sein, dass Sie keinen 8.3-Dateinamen 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 ordnungsgemäß 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 entscheiden.

Um das neue Verhalten für lange Pfade 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 sein. 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 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 über ein 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 gesteuert Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths 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 aufweisen, wenn Sie sich für das Verhalten mit langen Pfaden entscheiden: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Dies sind die Dateiverwaltungsfunktionen, die keine MAX _ PATH-Einschränkungen mehr aufweisen, wenn Sie sich für das Verhalten des langen Pfads 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.