it-swarm.com.de

Warum ist die Pfadlänge von 260 Zeichen in Windows begrenzt?

Ich bin in unpassenden Momenten ein paar Mal auf dieses Problem gestoßen:

  • versuchen an Open Source Java Projekten mit tiefen Pfaden zu arbeiten
  • Speichern von tiefen Fitnesse-Wiki-Bäumen in der Quellcodeverwaltung
  • Ein Fehler beim Versuch, meinen Versionsverwaltungsbaum mit Bazaar zu importieren

Warum gibt es diese Grenze?

Warum wurde es noch nicht entfernt?

Wie gehen Sie mit dem Pfadlimit um? ... und nein, ein Wechsel zu Linux oder Mac OS X ist keine gültige Antwort auf diese Frage;)

369
Jeffrey Cameron

Zitiert diesen Artikel https://docs.Microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

Maximale Pfadlängenbegrenzung

In der Windows-API (mit einigen Ausnahmen, die in den folgenden Abschnitten erläutert werden) beträgt die maximale Länge für einen Pfad MAX_PATH , der 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 Nullzeichen. Beispielsweise ist der maximale Pfad auf Laufwerk D "D: \eine Pfadzeichenfolge mit 256 Zeichen<NUL> "wobei" <NUL> "das unsichtbare abschließende Nullzeichen für die aktuelle System-Codepage darstellt. (Die Zeichen <> werden hier aus Gründen der Übersichtlichkeit verwendet und können nicht Teil einer gültigen Pfadzeichenfolge sein.)

Jetzt sehen wir, dass es 1 + 2 + 256 + 1 oder [Laufwerk] [: \] [Pfad] [Null] = 260 ist. Man könnte annehmen, dass 256 eine vernünftige feste Zeichenkettenlänge aus den DOS-Tagen ist. Wenn wir zu den DOS-APIs zurückkehren, stellen wir fest, dass das System den aktuellen Pfad pro Laufwerk verfolgt hat und wir haben 26 (32 mit Symbolen) maximale Laufwerke (und aktuelle Verzeichnisse).

Die INT 0x21 AH = 0x47 sagt: "Diese Funktion gibt die Pfadbeschreibung ohne den Laufwerksbuchstaben und den anfänglichen Backslash zurück." Wir sehen also, dass das System das CWD als Paar (Laufwerk, Pfad) speichert und Sie nach dem Pfad fragen, indem Sie das angeben Laufwerk (1 = A, 2 = B,…): Wenn Sie eine 0 angeben, wird der Pfad für das von INT zurückgegebene Laufwerk verwendet. 0x21 AH = 0x15 AL = 0x19. Jetzt wissen wir also, warum es 260 und nicht 256 sind, weil diese 4 Bytes nicht in der Pfadzeichenfolge gespeichert sind.

Warum eine 256-Byte-Pfadzeichenfolge, weil 640 KB RAM ausreichen.

214
valli

Dies gilt nicht unbedingt, da das NTFS-Dateisystem Pfade mit bis zu 32 KB Zeichen unterstützt. Sie können die Win32-API und "\\?\ "dem Pfad voranstellen, um mehr als 260 Zeichen zu verwenden.

Eine ausführliche Erklärung des langen Weges aus dem .Net BCL-Team-Blog .
Ein kleiner Auszug beleuchtet das Thema mit langen Wegen

Ein weiteres Problem ist das inkonsistente Verhalten, das sich aus der Offenlegung der Unterstützung für lange Wege ergeben würde. Lange Wege mit dem \\?\ Präfix kann in den meisten dateibezogenen Windows-APIs verwendet werden, jedoch nicht in allen Windows-APIs. LoadLibrary, das ein Modul der Adresse des aufrufenden Prozesses zuordnet, schlägt beispielsweise fehl, wenn der Dateiname länger als MAX_PATH ist. Das bedeutet, dass Sie mit MoveFile eine DLL an einen Ort verschieben können, dessen Pfad länger als 260 Zeichen ist. Wenn Sie jedoch versuchen, die DLL zu laden, schlägt dies fehl. Es gibt ähnliche Beispiele Windows-APIs: Es gibt einige Problemumgehungen, die jedoch von Fall zu Fall unterschiedlich sind.

142
softveda

Die Frage ist warum besteht die Einschränkung noch. Sicherlich kann modernes Windows die Seite von MAX_PATH Vergrößern, um längere Pfade zu ermöglichen. Warum wurde die Einschränkung nicht aufgehoben?

  • Der Grund, warum es nicht entfernt werden kann, ist, dass Windows versprochen hat, es würde sich nie ändern.

Durch den API-Vertrag hat Windows allen Anwendungen garantiert, dass die Standard-Datei-APIs niemals einen Pfad zurückgeben, der länger als 260 Zeichen ist.

Betrachten Sie den folgenden richtigen Code:

WIN32_FIND_DATA findData;

FindFirstFile("C:\Contoso\*", ref findData);

Windows garantiert mein Programm, dass es meine WIN32_FIND_DATA - Struktur füllen würde:

WIN32_FIND_DATA {
   DWORD    dwFileAttributes;
   FILETIME ftCreationTime;
   FILETIME ftLastAccessTime;
   FILETIME ftLastWriteTime;
   //...
   TCHAR    cFileName[MAX_PATH];
   //..
}

Meine Anwendung hat den Wert der Konstante MAX_PATH Nicht deklariert, die Windows-API hat dies getan. Meine Anwendung hat diesen definierten Wert verwendet.

Meine Struktur ist korrekt definiert und weist insgesamt nur 592 Bytes zu. Das bedeutet, dass ich nur einen Dateinamen empfangen kann, der weniger als 260 Zeichen enthält. Windows versprochen Wenn ich meine Bewerbung richtig geschrieben hätte, würde meine Bewerbung auch in Zukunft funktionieren.

Wenn Windows Dateinamen zulässt, die länger als 260 Sind, schlägt meine vorhandene Anwendung (die die richtige API korrekt verwendet hat) fehl.

Wenn Sie Microsoft auffordern, die Konstante MAX_PATH Zu ändern, müssen Sie zunächst sicherstellen, dass keine vorhandene Anwendung fehlschlägt. Zum Beispiel besitze und verwende ich immer noch eine Windows-Anwendung, die für Windows 3.11 geschrieben wurde. Es läuft immer noch unter 64-Bit Windows 10. Das ist es, was Ihnen Abwärtskompatibilität bringt.

Microsoft hat erstellt eine Möglichkeit, die vollständigen 32.768 Pfadnamen zu verwenden; Dafür mussten sie jedoch einen neuen API-Vertrag erstellen. Zum einen sollten Sie die Shell-API zum Auflisten von Dateien verwenden (da nicht alle Dateien auf einer Festplatte oder einer Netzwerkfreigabe vorhanden sind).

Sie dürfen aber auch vorhandene Benutzeranwendungen nicht beschädigen. Die überwiegende Mehrheit der Anwendungen verwendet nicht die Shell-API für die Dateiarbeit. Jeder ruft einfach FindFirstFile/FindNextFile an und nennt es einen Tag.

101
Ian Boyd

Ab Windows 10 können Sie die Einschränkung entfernen durch Ändern eines Registrierungsschlüssels.

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

Mit einem Registrierungsschlüssel können Sie das neue Verhalten bei langen Pfaden aktivieren oder deaktivieren. Um das Verhalten bei langen Pfaden zu aktivieren, setzen Sie den Registrierungsschlüssel auf HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Typ: REG_DWORD). Der Wert des Schlüssels wird vom System (pro Prozess) nach dem ersten Aufruf einer betroffenen Win32-Datei oder -Verzeichnisfunktion zwischengespeichert (Liste folgt). Der Registrierungsschlüssel wird während der Lebensdauer des Prozesses nicht neu geladen. Damit alle Apps auf dem 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. Der Registrierungsschlüssel kann auch über die Gruppenrichtlinie unter Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths Gesteuert werden. Sie können das neue Verhalten für lange Pfade auch pro App über das Manifest aktivieren:

<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>
55
Root Loop

Sie können einen Ordner als Laufwerk bereitstellen. Wenn Sie in der Befehlszeile einen Pfad C:\path\to\long\folder Haben, können Sie diesen Laufwerksbuchstaben X: Zuordnen:

subst x: \path\to\long\folder
29
jonchang

Eine Möglichkeit, mit der Pfadbeschränkung umzugehen, besteht darin, Pfadeingaben mit symbolischen Links zu verkürzen.

Zum Beispiel:

  1. ein ... kreieren C:\p Verzeichnis für kurze Links zu langen Pfaden
  2. mklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
  3. hinzufügen C:\p\foo zu deinem Pfad anstatt zu dem langen Pfad
16
JDiMatteo

Wie Sie mit der Pfadgrößenbeschränkung unter Windows umgehen - mit 7Zip können Sie Ihre pfadlängensensitiven Dateien packen (und entpacken). Ich habe es verwendet, um mehrere IDE) - Installationen (diese Eclipse-Plugin-Pfade, yikes!) Und Stapel von automatisch generierter Dokumentation zu transportieren, und hatte bisher noch kein einziges Problem.

Ich bin mir nicht sicher, wie es das von Windows festgelegte 260-Zeichen-Limit (von einem technischen PoV) umgeht, aber hey, es funktioniert!

Weitere Details auf ihrer SourceForge-Seite hier :

"NTFS kann tatsächlich Pfadnamen mit einer Länge von bis zu 32.000 Zeichen unterstützen."

7-Zip unterstützt auch so lange Namen.

Aber es ist in SFX-Code deaktiviert. Einige Benutzer mögen keine langen Wege, da sie nicht verstehen, wie sie mit ihnen arbeiten sollen. Deshalb habe ich es im SFX-Code deaktiviert.

und Versionshinweise :

9.32 alpha 01.12.2013

  • Verbesserte Unterstützung für Dateipfadnamen mit mehr als 260 Zeichen.

4,44 Beta 2007-01-20

  • 7-Zip unterstützt jetzt Dateipfadnamen mit mehr als 260 Zeichen.

WICHTIGER HINWEIS: Damit dies ordnungsgemäß funktioniert, müssen Sie den Zielpfad im Dialogfeld 7Zip "Extrahieren" angeben direkt, anstatt die Dateien per Drag & Drop in den gewünschten Ordner zu ziehen. Andernfalls wird der Ordner "Temp" als Zwischen-Cache verwendet, und Sie werden dieselbe Beschränkung von 260 Zeichen anwenden, sobald Windows Explorer die Dateien an ihren "endgültigen Ruheplatz" verschiebt. Weitere Informationen finden Sie in den Antworten auf diese Frage .

7
Priidu Neemre

Was warum betrifft, so gibt es dies immer noch - MS betrachtet es nicht als Priorität und schätzt die Abwärtskompatibilität gegenüber der Weiterentwicklung ihres Betriebssystems (zumindest in diesem Fall).

Eine Problemumgehung, die ich verwende, besteht darin, die "Kurznamen" für die Verzeichnisse im Pfad anstelle der von Menschen lesbaren Standardversionen zu verwenden. Also z. B. für C:\Program Files\ Ich würde ... benutzen C:\PROGRA~1\ Die entsprechenden Kurznamen finden Sie mit dir /x.

7
Conrad

Sie können lange Pfadnamen mit PowerShell aktivieren:

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Type DWord -Value 1 

Eine andere Version ist die Verwendung einer Gruppenrichtlinie in Computer Configuration/Administrative Templates/System/Filesystem:

Group Policy Editor

6
MovGP0

Es funktioniert, und es ist aus irgendeinem Grund ein Standard, aber Sie können es leicht mit diesem Registrierungsschlüssel überschreiben:

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

Siehe: https://blogs.msdn.Microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/

4

Eine andere Möglichkeit, damit umzugehen, besteht darin, Cygwin zu verwenden, je nachdem, was Sie mit den Dateien tun möchten (d. H. Ob Cygwin-Befehle Ihren Anforderungen entsprechen).

Beispielsweise können damit Dateien kopiert, verschoben oder umbenannt werden, die selbst Windows Explorer nicht kann. Oder natürlich mit deren Inhalten wie md5sum, grep, gzip usw. umgehen.

Auch für Programme, die Sie codieren, könnten Sie sie mit Cygwin verknüpfen DLL und es würde ihnen ermöglichen, lange Pfade zu verwenden (ich habe dies jedoch nicht getestet)

2
eliblanco87