Maximale Dateinamenlänge in NTFS (Windows XP und Windows Vista)?

260

Ich entwerfe eine Datenbanktabelle, die Dateinamen von hochgeladenen Dateien enthält. Was ist die maximale Länge eines Dateinamens in NTFS, wie er von Windows XP oder Vista verwendet wird?

GateKiller
quelle
83
Ich habe noch nie so viele verschiedene Antworten auf eine einfache Frage gesehen. 199, 255, 256, 257, 260, "ungefähr 30 000", "ungefähr 32 000" und "es kommt darauf an". Sicher, es gibt Qualifikanten, aber diese können nicht alle richtig sein, oder?
UnconditionallyReinstateMonica
7
Ich weiß das, da ich eine Anwendung erstellen musste, um zu verhindern, dass Unternehmensbenutzer dies erreichen, da dies Probleme auf unseren Speicherservern verursacht.
RobertPitt
2
@ RobertPitt. Sie vermissen dort etwas. Zitat aus MSDN: "Die maximale Länge für einen Pfad ist MAX_PATH, die als 260 Zeichen definiert ist"
Michael Olesen
7
@ Michael9000. Ich glaube, RobertPitt hat das Dateinamenlimit angegeben (worum es in dieser Frage geht), nicht das Pfadlimit.
GDW2
7
NTFS ist NICHT auf MAX_PATH beschränkt, die Windows-Shell ist auf MAX_PATH beschränkt, die maximale Pfadlänge von NTFS beträgt
32 KB

Antworten:

286

Einzelne Komponenten eines Dateinamens (dh jedes Unterverzeichnis entlang des Pfads und der endgültige Dateiname) sind auf 255 Zeichen und die Gesamtpfadlänge auf ungefähr 32.000 Zeichen begrenzt.

Unter Windows darf der MAX_PATHWert jedoch nicht überschritten werden (259 Zeichen für Dateien, 248 für Ordner). Sehenhttp://msdn.microsoft.com/en-us/library/aa365247.aspx für weitere Informationen.

Adam Rosenfield
quelle
4
Hier sind einige weitere Fakten, die diese Antwort bestätigen (Windows ist normalerweise auf 260 Zeichen beschränkt): msdn.microsoft.com/en-us/library/… und blogs.msdn.com/b/bclteam/archive/2007/02/13 /…
Michael Olesen
62
Richtig für NTFS, nicht korrekt für Windows, gemäß dem von Ihnen angegebenen Link: "In der Windows-API (mit einigen in den folgenden Absätzen beschriebenen Ausnahmen) beträgt die maximale Länge für einen Pfad MAX_PATH, der als 260 Zeichen definiert ist." Die Gesamtstrecke, für alle praktischen Zwecke, beschränkt auf 259 Zeichen ( unter Berücksichtigung der Null-Terminator).
Lawrence Dol
9
Wenn Sie die "Unicode-Version" der Windows-API-Dateimethoden verwenden, können Sie anscheinend bis zu 32767 erhalten, wenn Sie den Pfadnamen "\\? \" Vorstellen. Ist das richtig?
Rogerdpack
6
@rogerdpack: für den vollständigen Pfad, ja, aber jede einzelne Komponente (Unterordner / endgültige Datei) hat ein Limit von 255 utf-16-Codepunkten. Außerdem erwartet normale Software MAX_PATH, also ... Boom :)
Snemarch
5
In Windows 10 (Version 1607 - Jubiläumsupdate) und Windows Server 2016 haben Sie die Möglichkeit, das Problem MAX_PATH zu ignorieren, indem Sie einen Gruppenrichtlinieneintrag überschreiben. Aktivieren Sie lange NTFS-Pfade unter Computerkonfiguration -> Admin-Vorlagen -> System -> Dateisystem:
Steven Mark Ford
28

Es sind 257 Zeichen. Um genau zu sein: NTFS selbst legt eine maximale Dateinamenlänge von mehreren tausend Zeichen fest (ungefähr 30'000). Windows legt jedoch eine maximale Länge von 260 für den Pfad + Dateinamen fest. Der Ordner "Laufwerk +" nimmt mindestens 3 Zeichen auf, sodass Sie 257 erhalten.

Alphager
quelle
21
Falsch - Der NUL-Terminator ist Teil von MAX_PATH, sodass Sie einen maximalen Pfad von 256 Zeichen haben (den Sie aufgrund des Einzelkomponentenlimits von 255 nicht erstellen können).
Snemarch
4
"die Sie aufgrund des Einzelkomponentenlimits von 255 nicht erstellen können" Falsch. Wir sprechen hier von maximaler Pfadlänge, nicht von maximaler Länge einzelner Pfadkomponenten. "Wenn Sie eine API zum Erstellen eines Verzeichnisses verwenden, darf der angegebene Pfad nicht so lang sein, dass Sie keinen 8.3-Dateinamen anhängen können (dh der Verzeichnisname darf MAX_PATH minus 12 nicht überschreiten)."
Ludovic Kuty
Diese Debatte kommt nur zustande, weil die Low-Level-API die Erstellung von Dateinamen mit 256 Zeichen ermöglicht, unter der Annahme, dass die 256 Zeichen eine Null sind, die Datei jedoch für native Anwendungen nicht mehr zugänglich (versteckt) ist und daher im Allgemeinen nicht nützlich ist.
Conrad B
1
@ LudovicKuty: Eigentlich sprach das OP über die Beschränkung der Dateinamenlänge , nicht über die Pfadlänge (ja, sogar in der ursprünglichen Revision habe ich überprüft). Und er / sie bezog sich sehr spezifisch auf NTFS-Grenzwerte und nicht auf die Grenzwerte des Betriebssystems, eines bestimmten Subsystems oder einer bestimmten API oder eines bestimmten Frameworks.
0xC0000022L
@ 0xC0000022L Ja, in der Tat. Ich habe es in der OP-Frage falsch verstanden und mich auf die Kommentare konzentriert, die sich mit Dateinamenlänge und Pfadlänge befassen.
Ludovic Kuty
27

Dies ist, was die "Nicht behandelte Ausnahme" in Framework 4.5 sagt, wenn versucht wird, eine Datei mit einem langen Dateinamen zu speichern:

Der angegebene Pfad, Dateiname oder beide sind zu lang. Der vollständig qualifizierte Dateiname muss weniger als 260 Zeichen und der Verzeichnisname weniger als 248 Zeichen enthalten.

Bildschirmfoto

SturmCoder
quelle
16

199 unter Windows XP NTFS habe ich gerade überprüft.

Dies ist keine Theorie, sondern nur das Anprobieren meines Laptops. Es mag mildernde Effekte geben, aber ich kann es physisch nicht größer machen.

Gibt es eine andere Einstellung, die dies einschränkt? Probieren Sie es aus.

Taube
quelle
1
Bestätigt dies auf meiner Version von XP, was für ein Schmerz
Julian Young
Ich habe genau das gleiche unter Windows XP gemacht, nur um zu kichern. Ich habe ein Limit von 200 Zeichen erreicht. Dann habe ich 255 Mal eine Datei erstellt w, diese gelöscht und unter Windows 7 x64 einen gleichnamigen Ordner erstellt. Die Frage ist nun, was hier der begrenzende Faktor ist: die NTFS-Version, das Betriebssystem oder das Subsystem oder die Win32-API in XP?
0xC0000022L
Das Limit von 200 Zeichen scheint im Explorer zu liegen. Andere Programme können längere Dateinamen erstellen. Dies ist wahrscheinlich eine absichtliche Grenze, um den Benutzer vor sich selbst zu retten. :-)
avl_sweden
13

Laut MSDN sind es 260 Zeichen. Es enthält "<NUL>"das unsichtbare abschließende Nullzeichen, sodass die tatsächliche Länge 259 beträgt.

Aber lesen Sie den Artikel, es ist etwas komplizierter.

Kibbee
quelle
1
Tatsächlich besagt der MSDN-Artikel, auf den verwiesen wird, dass der Pfad auf 260 Zeichen begrenzt ist, die Länge des Dateinamens jedoch vom Dateisystem abhängt (üblicherweise jedoch 255 Byte). Es ist jedoch möglich, "Unicode-Versionen [der Windows-API-Funktionen]" zu verwenden, um das Pfadlimit auf 32767 Byte zu erhöhen. Dieses Limit wird jedoch dadurch verringert, dass Windows das erforderliche \\?\ Präfix zur Laufzeit intern auf eine nicht angegebene Länge erweitert. Der Pfad muss nach dieser Erweiterung unter 32767 Byte bleiben.
Mikko Rantalainen
13

Die Länge in NTFS beträgt 255. Das NameLengthFeld im NTFS- $FilenameAttribut ist ein Byte ohne Offset. Dies ergibt einen Bereich von 0 bis 255.

Der Dateiname iself kann sich in verschiedenen "Namespaces" befinden. Bisher gibt es: POSIX, WIN32, DOS und (WIN32DOS - wenn ein Dateiname nativ ein DOS-Name sein kann). (Da die Zeichenfolge eine Länge hat, könnte sie \ 0 enthalten, dies würde jedoch zu Problemen führen und befindet sich nicht in den obigen Namespaces.)

Somit kann der Name einer Datei oder eines Verzeichnisses bis zu 255 Zeichen lang sein. Wenn Sie den vollständigen Pfad unter Windows die Angabe, müssen Sie den Pfad mit dem Präfix \\? \ (Oder verwenden Sie \\? \ UNC \ Server \ Freigabe für UNC - Pfade) diesen Weg als extended-Länge eines markieren (~ 32k Zeichen) . Wenn Ihr Pfad länger ist, müssen Sie Ihr Arbeitsverzeichnis auf dem Weg festlegen (ugh - Nebenwirkungen aufgrund der prozessweiten Einstellung).

Dominik Weber
quelle
4

Ich füge dies der oben genehmigten Antwort hinzu.

Um klar zu sein, glauben die Leute, dass es 255-260 Zeichen sind, weil das alles ist, was Windows Explorer unterstützt. Es wird ein Fehler beim Ausführen einer Dateikopie für Dateinamen auftreten, die länger dauern. Ein Programm kann jedoch viel längere Dateinamen lesen und schreiben (so gelangen Sie zu Längen, über die sich der Explorer überhaupt beschwert). Microsoft empfiehlt in solchen Situationen, die Datei in dem ursprünglichen Programm zu öffnen, in dem sie geschrieben wurde, und sie umzubenennen.

std''OrgnlDave
quelle
Ich habe versucht, eine Datei tief in einer Ordnerhierarchie zu speichern, die definitiv mehr als 260 Zeichen von der Befehlszeile mit vim überschreitet, war jedoch nicht erfolgreich.
Panny
@panny: Die Autoren von Vim haben sich also nicht darum gekümmert, lange Pfadnamen zu implementieren. Das ist weder Windows noch das Win32-Subsystem schuld, noch hat es etwas mit der Dateinamenlängenbeschränkung für NTFS zu tun, nach der das OP gefragt hat.
0xC0000022L
3

Laut der neuen Windows SDK-Dokumentation (8.0) scheint eine neue Pfadbeschränkung vorgesehen zu sein. Es gibt einen neuen Satz von Pfadhandhabungsfunktionen und eine Definition von PATHCCH_MAX_CCH wie folgt:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000
Cplusminus_is_coming
quelle
3
Der Windows 8-Explorer (in meinem Fall Win8.1-Vorschau) funktioniert jedoch nicht mit dieser Beschränkung und akzeptiert keine Pfade mit mehr als 259 Zeichen.
Cplusminus_is_coming
3

In diesem Teil der offiziellen Dokumentation wird klargestellt, dass es sich um 255 Unicode-Zeichen für NTFS, exFAT und FAT32 und 127 Unicode- oder 254 ASCII-Zeichen für UDF handelt.

Abgesehen davon beträgt die maximale Länge des Pfadnamens immer 32.760 Unicode-Zeichen, wobei jede Pfadkomponente nicht mehr als 255 Zeichen enthält.

krächzen
quelle
Nahe genug. Wie ich in einem Kommentar zur akzeptierten Antwort erwähne, handelt es sich um 32767 WCHARElemente. Nein, es handelt sich nicht um "Unicode-Zeichen" (überprüfen Sie Ihre Unicode-Terminologie: Codepunkte, Zeichen usw. ...!).
0xC0000022L
-2

238! Ich habe es unter Win7 32 Bit mit dem folgenden Bat-Skript überprüft:

set "fname="
for /l %%i in (1, 1, 27) do @call :setname
@echo %fname%
for /l %%i in (1, 1, 100) do @call :check
goto :EOF
:setname
set "fname=%fname%_123456789"
goto :EOF
:check
set "fname=%fname:~0,-1%"
@echo xx>%fname%
if not exist %fname% goto :eof
dir /b
pause
goto :EOF
SzB
quelle
Ich habe es unter Windows 7 mit einem Programm überprüft, das lange Pfade korrekt verarbeitet. Jedes einzelne Pfadsegment kann 255 Zeichen aufnehmen (ich habe es verwendet w). So was nun?
0xC0000022L
-2

Tatsächlich ist es 256, siehe Vergleich der Dateisystemfunktionalität, Grenzwerte .

So wiederholen Sie einen Beitrag auf http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

"Angenommen, es handelt sich um NTFS und nicht um FAT32. Die" 255 Zeichen für Pfad + Datei "sind eine Einschränkung des Explorers und nicht des Dateisystems selbst. NTFS unterstützt Pfade mit einer Länge von bis zu 32.000 Unicode-Zeichen, wobei jede Komponente bis zu 255 Zeichen enthält.

Der Explorer und die Windows-API beschränken Sie auf 260 Zeichen für den Pfad, einschließlich Laufwerksbuchstabe, Doppelpunkt, Schrägstriche und ein abschließendes Nullzeichen. Es ist möglich, einen längeren Pfad in Windows zu lesen, wenn Sie ihn mit einem \\"

Wenn Sie die obigen Beiträge lesen, werden Sie feststellen, dass es eine fünfte Sache gibt, bei der Sie sich sicher sein können: Mindestens einen hartnäckigen Computerbenutzer finden!

Fane
quelle
4
Nein - es ist 255. Das Feld NameLength im Attribut NTFS $ Filename ist ein Byte ohne Offset. Dies ergibt einen Bereich von 0-255
Dominik Weber
-2

Ich kann im WS 2012 Explorer keine Datei mit dem Namen + Punkt + Extnesion erstellen, die länger als 224 Zeichen ist. Erschieße nicht den Boten!

In der CMD desselben Servers kann ich keinen Namen mit mehr als 235 Zeichen erstellen :

Das System kann den angegebenen Pfad nicht finden.

Die im Explorer erstellte Datei mit einem 224-stelligen Namen kann in Notepad ++ nicht geöffnet werden. Stattdessen wird nur eine neue Datei angezeigt.

ajeh
quelle
The system cannot find the path specified.ist nicht dasselbe wie The specified path, file name, or both are too long.. Ich denke du hattest einen Tippfehler oder so. Sie erhalten diese Meldung, wenn Sie versuchen, eine Datei in einem nicht vorhandenen Pfad zu erstellen, oder wenn Sie in eine Richtung wechseln möchten, die nicht vorhanden ist.
Matthias Burger