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, Durch umgekehrte Schrägstriche getrennte Namenkomponenten und ein endendes NULL-Zeichen. Der maximale Pfad auf Laufwerk D lautet z. B. "D:\some 256-character path string<NUL>" wobei "<NUL>" das unsichtbare endende Nullzeichen für die aktuelle Systemcodepage darstellt. (Die Zeichen <> werden hier zur visuellen Klarheit verwendet und können nicht Teil einer gültigen Pfadzeichenfolge sein.)
Beispielsweise können Sie diese Einschränkung erreichen, wenn Sie ein git-Repository klonen, das lange Dateinamen in einem Ordner enthält, der selbst einen langen Namen hat.
Hinweis
Datei-E/A-Funktionen in der Windows-API konvertieren "/" zu "\" im Rahmen der Konvertierung des Namens in einen NT-Formatvorlagennamen, mit Ausnahme der Verwendung des Präfixes "\\?\", wie in den folgenden Abschnitten beschrieben.
Die Windows-API verfügt über viele Funktionen, die auch Unicode-Versionen aufweisen, 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. Jeder wert, der im Parameter lpMaximumComponentLength der GetVolumeInformation-Funktion zurückgegeben wird (dieser Wert ist üblicherweise 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 "\\?\" 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 universellen Benennungskonvention (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 minimalen Änderungen an das System übergeben werden soll. Dies bedeutet, dass Sie keine Schrägstriche zur Darstellung von Pfadtrennzeichen, keinen Punkt zur Darstellung des aktuellen Verzeichnisses und keine doppelten Punkte zur Darstellung 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 Summe von MAX_PATH-Zeichen beschränkt.
Es ist nicht erforderlich, eine Unicode-Normalisierung für Pfad- und Dateinamenzeichenfolgen für die Verwendung durch die Windows-Datei-I/O-API-Funktionen durchzuführen, da das Dateisystem Pfad- und Dateinamen als undurchsichtige Sequenz von WCHARs behandelt. Jede Normalisierung, die Ihre Anwendung erfordert, sollte im Hinterkopf ausgeführt werden, 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 lange sein, dass Sie keinen 8.3-Dateinamen anfügen können (d. h. 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, der von der Shell-Benutzeroberfläche nicht ordnungsgemäß interpretiert werden kann.
Aktivieren langer Pfade in Windows 10, Version 1607 und höher,
Ab Windows 10, Version 1607, wurdenMAX_PATH Einschränkungen aus vielen gängigen Win32-Datei- und Verzeichnisfunktionen entfernt. Ihre App muss sich jedoch für das neue Verhalten anmelden.
Um das neue Verhalten des langen Pfads pro Anwendung zu aktivieren, müssen zwei Bedingungen erfüllt sein. Ein Registrierungswert muss festgelegt werden, und das Anwendungsmanifest muss das longPathAware
-Element enthalten.
Registrierungseinstellung zum Aktivieren langer Pfade
Wichtig
Verstehen Sie, dass sich das Aktivieren dieser Registrierungseinstellung nur auf Anwendungen auswirkt, die geändert wurden, um das neue Feature zu nutzen. Entwickler müssen ihre Apps als langen Pfad deklarieren, wie in den folgenden Anwendungsmanifesteinstellungen beschrieben. Dies ist keine Änderung, die sich auf alle Anwendungen auswirkt.
Der Registrierungswert HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
muss vorhanden sein und auf 1
. Der Registrierungswert 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 Registrierungswert wird während der Lebensdauer des Prozesses nicht neu geladen. Damit alle Apps auf dem System den Wert 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
Diese Registrierungseinstellung kann auch über Gruppenrichtlinien unter Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
.
Aktualisierungen des Anwendungsmanifests zum Deklarieren von Long Path-Funktionen
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>
Funktionen ohne MAX_PATH Einschränkungen
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.