Ich bin in ungünstigen Momenten einige Male auf dieses Problem gestoßen:
- Der Versuch, an Open Source-Java-Projekten mit tiefen Pfaden zu arbeiten
- Speichern von tiefen Fitnesse-Wiki-Bäumen in der Quellcodeverwaltung
- Ein Fehler beim Versuch, Bazaar zum Importieren meines Versionsverwaltungsbaums zu verwenden
Warum gibt es diese Grenze?
Warum wurde es noch nicht entfernt?
Wie gehen Sie mit der Pfadbegrenzung um? Und nein, ein Wechsel zu Linux oder Mac OS X ist keine gültige Antwort auf diese Frage;)
Antworten:
Zitieren dieses Artikels https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
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 Zeichenfolgenlänge aus den DOS-Tagen ist. Wenn wir zurück zu den DOS-APIs gehen, stellen wir fest, dass das System den aktuellen Pfad pro Laufwerk verfolgt hat und wir maximal 26 (32 mit Symbolen) Laufwerke (und aktuelle Verzeichnisse) haben.
Das 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 die CWD als Paar (Laufwerk, Pfad) speichert und Sie nach dem Pfad fragen, indem Sie das Laufwerk angeben (1 = A, 2 = B,…). Wenn Sie eine 0 angeben, nimmt es den Pfad für an Das von INT 0x21 AH = 0x15 AL = 0x19 zurückgegebene Laufwerk. Jetzt wissen wir also, warum es 260 und nicht 256 ist, weil diese 4 Bytes nicht in der Pfadzeichenfolge gespeichert sind.
Warum eine 256-Byte-Pfadzeichenfolge, weil 640 KB genug RAM sind.
quelle
Dies gilt nicht unbedingt, da das NTFS-Dateisystem Pfade mit bis zu 32.000 Zeichen unterstützt. Sie können die Win32-API und das
\\?\
Präfix " " verwenden, um mehr als 260 Zeichen zu verwenden.Eine ausführliche Erklärung des langen Weges aus dem .Net BCL-Teamblog .
Ein kleiner Auszug beleuchtet das Problem mit langen Wegen
quelle
Die Frage ist, warum die Einschränkung noch besteht. Sicherlich können moderne Windows die Seite vergrößern
MAX_PATH
, um längere Pfade zu ermöglichen. Warum wurde die Einschränkung nicht aufgehoben?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 korrekten Code:
Windows garantierte meinem Programm, dass es meine
WIN32_FIND_DATA
Struktur füllen würde :Meine Anwendung hat den Wert der Konstante nicht deklariert
MAX_PATH
, die Windows-API jedoch. Meine Anwendung hat diesen definierten Wert verwendet.Meine Struktur ist korrekt definiert und weist nur die
592
Gesamtzahl der Bytes zu. Das bedeutet, dass ich nur einen Dateinamen erhalten kann, der weniger als260
Zeichen enthält. Windows versprach mir, dass meine Anwendung auch in Zukunft funktionieren würde, wenn ich meine Anwendung richtig schreiben würde.Wenn Windows Dateinamen länger als
260
Zeichen zulässt, schlägt meine vorhandene Anwendung (die die richtige API korrekt verwendet hat) fehl.Wenn Microsoft die
MAX_PATH
Konstante ändern soll , muss zunächst sichergestellt werden, dass keine vorhandene Anwendung fehlschlägt. Zum Beispiel besitze und verwende ich immer noch eine Windows-Anwendung, die für die Ausführung unter Windows 3.11 geschrieben wurde. Es läuft immer noch unter 64-Bit-Windows 10. Genau das bringt Ihnen die Abwärtskompatibilität.Microsoft hat eine Möglichkeit geschaffen, 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 verwenden, um Dateien aufzulisten (da nicht alle Dateien auf einer Festplatte oder einer Netzwerkfreigabe vorhanden sind).
Sie müssen aber auch vorhandene Benutzeranwendungen nicht beschädigen. Die überwiegende Mehrzahl der Anwendungen nicht nicht verwenden , um das Shell - api für Kleinarbeit. Jeder ruft einfach an
FindFirstFile
/ anFindNextFile
und nennt es einen Tag.quelle
Unter Windows 10 können Sie die Einschränkung aufheben, indem Sie einen Registrierungsschlüssel ändern.
quelle
Sie können einen Ordner als Laufwerk bereitstellen. Wenn Sie über die Befehlszeile einen Pfad haben
C:\path\to\long\folder
, können Sie ihn dem Laufwerksbuchstaben zuordnen,X:
indem Sie Folgendes verwenden:quelle
subst
ist local-session / account - siehe superuser.com/questions/29072/…, wie man es "systemweit" machtEine Möglichkeit, mit der Pfadbeschränkung umzugehen, besteht darin, Pfadeinträge mit symbolischen Links zu verkürzen.
Zum Beispiel:
C:\p
Verzeichnis, um kurze Links zu langen Pfaden zu erhaltenmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
Ihrem Pfad anstelle des langen Pfads hinzuquelle
/j
Option erstellt einen Junction-Mountpoint für ein lokales Volume-Gerät oder einen Pfad auf einem lokalen Volume (wie ein Unix-Bind-Mount). Es wird keine symbolische Verknüpfung erstellt. Dies ist eine wichtige Unterscheidung, da Junction-Mountpunkte immer auf einem Server ausgewertet werden und auf lokale Geräte abzielen müssen, während symbolische Links auf dem Client ausgewertet werden und auf Remotepfade abzielen können (sofern dies nach Richtlinien zulässig ist). Wie ein subst.exe-Laufwerk (dhDefineDosDeviceW
) ist ein Junction-Ziel normalerweise auf etwa 4 KB Zeichen beschränkt. Es sind tatsächlich 8K-Zeichen, die ungefähr gleichmäßig zwischen dem Ersatzpfad und dem Anzeigepfad aufgeteilt sind.Sie können lange Pfadnamen mit PowerShell aktivieren:
Eine andere Version ist die Verwendung einer Gruppenrichtlinie in
Computer Configuration
/Administrative Templates
/System
/Filesystem
:quelle
Was , warum dies noch existiert - MS halte es für keine Priorität, und die Werte der Abwärtskompatibilität über ihre OS fort (zumindest in diesem Fall).
Eine Problemumgehung, die ich verwende, besteht darin, die "Kurznamen" für die Verzeichnisse im Pfad anstelle ihrer für Menschen lesbaren Standardversionen zu verwenden. Also zB für
C:\Program Files\
ich würde verwendenC:\PROGRA~1\
Sie können die Kurznamenäquivalente mit findendir /x
.quelle
PATH
und geben Sie es an weiterSearchPathW
. Es ist auch effizient, da die Laufzeitbibliothek ohnehin "\\? \" - Gerätepfade für NT erstellt. Bei neueren Dateisystemen würde wahrscheinlich keine andere Software auf einem exFAT-Volume als bei tragbaren Anwendungen installiert sein, da diese keine Sicherheit bietet, aber ich würde ReFS nicht ausschließen. Benutzer installieren Programme aus Gründen der Benutzerfreundlichkeit, des Speicherplatzes oder der Leistung an nicht standardmäßigen Standorten.Informationen zum Umgang mit der Pfadgrößenbeschränkung unter Windows: Die Verwendung von 7zip zum Packen (und Entpacken) Ihrer pfadlängensensitiven Dateien scheint eine praktikable Problemumgehung zu sein. Ich habe es verwendet, um mehrere IDE-Installationen (diese Eclipse-Plugin-Pfade, Huch!) Und Stapel automatisch generierter Dokumentation zu transportieren, und hatte bisher kein einziges Problem.
Ich bin mir nicht sicher, wie es das von Windows festgelegte Limit von 260 Zeichen (von einem technischen PoV) umgeht, aber hey, es funktioniert!
Weitere Details auf ihrer SourceForge-Seite hier :
und Versionshinweise :
WICHTIGER HINWEIS: Damit dies ordnungsgemäß funktioniert, müssen Sie den Zielpfad im 7zip- Dialogfeld "Extrahieren" direkt angeben , anstatt die Dateien per Drag & Drop in den vorgesehenen Ordner zu ziehen. Andernfalls wird der Ordner "Temp" als Zwischencache verwendet und Sie werden in die gleiche Beschränkung von 260 Zeichen versetzt, sobald Windows Explorer beginnt, die Dateien an ihren "letzten Ruheplatz" zu verschieben. Weitere Informationen finden Sie in den Antworten auf diese Frage .
quelle
Dies ist der Fall, und aus irgendeinem Grund ist dies eine Standardeinstellung. Sie können sie jedoch mit diesem Registrierungsschlüssel leicht überschreiben:
Siehe: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
quelle
Eine andere Möglichkeit, damit umzugehen, ist die Verwendung von Cygwin, je nachdem, was Sie mit den Dateien tun möchten (dh ob Cygwin-Befehle Ihren Anforderungen entsprechen).
Beispielsweise können Dateien kopiert, verschoben oder umbenannt werden, die selbst Windows Explorer nicht kann. Oder beschäftigen Sie sich natürlich mit deren Inhalten wie md5sum, grep, gzip usw.
Auch für Programme, die Sie codieren, können Sie sie mit der Cygwin-DLL verknüpfen und so lange Pfade verwenden (ich habe dies jedoch nicht getestet).
quelle