Ich versuche herauszufinden, wie lang der Pfad einer Datei maximal sein darf.
Dazu verwende ich den Standard-Dateimanager von Windows unter Windows 7 und das folgende PowerShell-Skript:
Get-ChildItem | Select Name, FullName, @{N="Path Length";E={$_.FullName.Length}} | Format-List
Ich öffne den Manager, erstelle die Datei abc.txt
in C:\
und füge dann Buchstaben hinzu, abc
sofern der Dateimanager dies zulässt. (Eigentlich verwende ich natürlich Kopieren und Einfügen. Das geht viel schneller.)
Dann mache ich den gleichen Test in C:\aaa
und C:\aaa\bbb
.
Aus irgendeinem Grund sind die Ergebnisse unterschiedlich. Die maximale Länge in C:\aaa
und C:\aaa\bbb
beträgt 259 Zeichen, aber die maximale Länge in C:\
beträgt 258 Zeichen. Warum?
C:\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
258 characters
C:\aaa\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcde.txt
259 characters
C:\aaa\bbb\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_a.txt
259 characters
aktualisieren
Von mail-archive.com, Python-Liste:
(https://www.mail-archive.com/[email geschützt]/msg444514.html)
die klassischen DOS-Pfadlängenbeschränkungen (z. B. 247, 258 oder 259 Zeichen, je nach Kontext).
Die folgenden Erklärungen stammen von mir.
247 steht für die maximale Länge des Pfades eines Verzeichnisses: 260 - 12 - 1 = 247. Dabei steht 12 für 8.3 Dateinamen und 1 für einen NUL-Terminator. Zum Beispiel C:\foo
oderC:\foo\bar
259 steht für die maximale Länge des Pfades einesDatei(kein Verzeichnis) gelegennichtim Stammverzeichnis des Laufwerks. Beispiel:C:\foo\aaa.txt
258 steht für die maximale Länge des Pfades einesDatei(kein Verzeichnis) gelegenIndas Stammverzeichnis des Laufwerks. Beispiel:C:\aaa.txt
Es gibt also tatsächlich drei Grenzen: 247, 258 und 259.
Aber warum haben wir ein Limit von 258 für Dateien im Stammverzeichnis des Laufwerks und 259 für Dateien in anderen Verzeichnissen?
Siehe auch:https://www.mail-archive.com/[email geschützt]/msg106171.html
MAX_PATH begrenzt Dateipfade auf mickrige 259 Zeichen (ohne abschließendes Nullzeichen); das aktuelle Verzeichnis auf 258 Zeichen (ohne abschließenden Backslash und Nullzeichen); und den Pfad eines neuen Verzeichnisses auf 247 Zeichen (ziehen Sie 12 von 259 ab, um Platz für einen 8.3-Dateinamen zu lassen).
Das zweite Zitat ergibt für mich jedoch keinen Sinn. Ich kann nicht verstehen, warum dieser Typ von einem abschließenden Backslash spricht. Der abschließende Backslash mag vorkommen, wenn wir über Verzeichnisse sprechen, aber nicht über Dateien!
Antwort1
Für den Unterschied habe ich eine einfache Erklärung: Fehlerhafter Code in Windows 7, der in Windows 10 neu geschrieben wurde. Weiter unten werde ich zeigen, warum ich das glaube und welche Regeln für die Länge von Dateinamen in Windows 7 und 10 gelten.
Aber zunächst eine kleine Anmerkung: Die 260-Grenze von MAX_PATH ist ein Artefakt einer viel früheren Windows-Version. Es kann nicht geändert werden, da die Windows-API es in ihren Datenstrukturen stark verwendet, beispielsweise in WIN32_FIND_DATA, so dass eine Erhöhung in der API zu einem Speicherüberlauf in bestehenden Anwendungen führen würde. Deshalb müssen längere Dateinamen explizit in der Registrierung und ein Programm muss in seinem Manifest seine Fähigkeit deklarieren, mit langen Namen umzugehen.
Ich stelle außerdem fest, dass der Laufwerksbuchstabe ( C:\
) nur im Text enthalten ist und sich nicht auf die Windows-Datenträgertabellen (MFT) bezieht. Windows weiß genau, auf welchem Datenträger sich die Datei befindet.
Nachfolgend sind meine Tests unter Windows 7 aufgeführt, bei denen meine Ergebnisse mit denen des Verfassers übereinstimmen:
Daraus lassen sich folgende Regeln ableiten:
- Der Laufwerksbuchstabe wird bei der Berechnung des Limits nicht berücksichtigt (
C:
) - Der führende Backslash wird bei der Grenzwertberechnung nicht berücksichtigt (
C:\
) - Der Rest ist auf 256 Zeichen begrenzt, einschließlich der dazwischenliegenden Backslashs
- Eine Stammdatei kann bis zu 255 Zeichen lang sein, was bei Dateien in Ordnern nicht möglich ist.
Diese sinnlosen Ergebnisse deuten stark darauf hin, dass der Code schlecht geschrieben ist.
Zunächst einmal ist, soweit es die MFT betrifft, jede Pfadkomponente separat und hat genau die gleichen Längenbeschränkungen wie jede andere Komponente (Unterordner). Es gibt also keinen inhärenten Grund für die Datenträgertabellen, die Länge von Dateinamen zu beschränken, nur weil sie in irgendeinem Ordner enthalten sind.
Zweitens stellt sich die Frage, warum eine Stammdatei auf 255 Zeichen begrenzt ist, obwohl es so aussieht, als ob es 256 Zeichen sein sollten, da es das einzige Element in ihrem Pfad ist (der, wie wir gesehen haben, 256 Zeichen lang sein kann).
Auf der Suche nach einer Erklärung kam ich zu der Theorie, dass 255 die tatsächliche, von Microsoft festgelegte Grenze für Dateinamen ist und der Rest eigentlich nur schlecht geschriebener Code ist.
Um diese Theorie zu überprüfen, habe ich das Verhalten von Windows 10 getestet. Ich habe unten dieselben Vorgänge wiederholt (zum Schreiben in sind Administratorrechte erforderlich C:\
):
Wie oben zu sehen ist, ist das Verhalten hier viel logischer: Zwischenkomponenten des Pfads werden bei der Begrenzung der Größe des Dateinamens, der immer 255 Zeichen beträgt, nicht mehr mitgezählt.
Es wurde deutlich, dass Microsoft von Anfang an beabsichtigt hatte, Dateinamen mit 255 Zeichen zuzulassen. In Windows 7 wurde dies jedoch durch Code deaktiviert, der den Pfad berücksichtigte, und zwar ohne wirklich guten Grund.
Weiteres Graben entdeckte die Dokumentation für das NTFS Attribut – $FILE_NAME (0x30), das ein Byte für die Länge des Dateinamens angibt (bei Offset 0x40). Dies erklärt gut die Beschränkung auf 255 Zeichen. (Siehe auch FireEye Teil 2: Die internen Strukturen eines Dateinamenattributs).
Kleine Anekdote: Gemäß dem Microsoft-Gesetz zur Fehlerbeseitigung konnte der Windows 10-Explorer die 255 Zeichen langen Dateien in C:\
, C:\Temp
und nicht löschen C:\Temp\abc
. Ich musste den Befehl in die Eingabeaufforderung eingeben, del 12*
um sie loszuwerden. (Einen Fehler beheben und gleichzeitig einen anderen einführen...)
Antwort2
Aus irgendeinem Grund sind die Ergebnisse unterschiedlich. Die maximale Länge in C:\aaa und C:\aaa\bbb beträgt 259 Zeichen, aber die maximale Länge in C:\ beträgt 258 Zeichen. Warum?
Ich glaube, Sie fragen sich, welche maximale Pfadlänge normalerweise im Windows Explorer zulässig ist. Es sind 260 Zeichen.
Das ermöglicht 248 Zeichen für den Pfad plus 12 Zeichen für den Dateinamen.
Die Namen Ihrer Beispieldateien sind aufgrund des Nullzeichens unterschiedlich.
In Windows-Editionen vor Windows 10, Version 1607, beträgt die maximale Länge eines Pfads MAX_PATH, was als 260 Zeichen definiert ist. In späteren Windows-Versionen muss zum Aufheben der Beschränkung ein Registrierungsschlüssel geändert oder das Gruppenrichtlinientool verwendet werden.
In der Windows-API (mit einigen Ausnahmen, die in den folgenden Abschnitten erläutert werden) beträgt die maximale Länge eines Pfads MAX_PATH, was als 260 Zeichen definiert ist. Ein lokaler Pfad ist in der folgenden Reihenfolge strukturiert: Laufwerksbuchstabe, Doppelpunkt, Backslash, durch Backslashs getrennte Namenskomponenten und ein abschließendes Nullzeichen. Beispielsweise ist der maximale Pfad auf Laufwerk D „D:\eine 256-stellige Pfadzeichenfolge“, wobei „“ das unsichtbare abschließende Nullzeichen für die aktuelle Systemcodepage darstellt. (Die Zeichen < > werden hier zur optischen Vereinfachung verwendet und können nicht Teil einer gültigen Pfadzeichenfolge sein.)
Quelle:
Antwort3
Es gibt zwei Grenzen, die zu beachten sind: eine ist die maximale Pfadlänge, die andere die maximale Dateinamenlänge. Unter NTFSDateinamen können bis zu 255 UTF-16-Codepunkte enthalten, ohne Nullbyte (siehe S. 12).
abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
ist genau 255 Zeichen lang.