Maksymalna długość nazwy pliku w systemie plików NTFS (Windows XP i Windows Vista)?

260

Projektuję tabelę bazy danych, w której będą przechowywane nazwy plików przesyłanych plików. Jaka jest maksymalna długość nazwy pliku w systemie plików NTFS używanego przez system Windows XP lub Vista?

GateKiller
źródło
83
Nigdy nie widziałem tak wielu różnych odpowiedzi na to, co powinno być prostym pytaniem. 199, 255, 256, 257, 260, „około 30 000”, „około 32 000” i „to zależy”. Jasne, są kwalifikatory, ale nie wszyscy mogą mieć rację, prawda?
Bezwarunkowo
7
255, wiem to, ponieważ musiałem zbudować aplikację, aby uniemożliwić użytkownikom korporacyjnym dotarcie do tego, ponieważ powoduje to problemy na naszych serwerach pamięci.
RobertPitt,
2
@RobertPitt. Coś tam brakuje. Cytat z MSDN: „maksymalna długość ścieżki to MAX_PATH, która jest zdefiniowana jako 260 znaków”
Michael Olesen
7
@ Michael9000. Uważam, że RobertPitt cytuje limit nazwy pliku (o to chodzi w tym pytaniu), a nie limit ścieżki.
gdw2
7
NTFS wcale NIE jest ograniczony do MAX_PATH, powłoka systemu Windows jest ograniczona do MAX_PATH, maksymalna długość ścieżki NTFS to 32k
paulm

Odpowiedzi:

286

Poszczególne elementy nazwy pliku (tj. Każdy podkatalog wzdłuż ścieżki i końcowa nazwa pliku) są ograniczone do 255 znaków, a całkowita długość ścieżki jest ograniczona do około 32 000 znaków.

Jednak w systemie Windows nie można przekroczyć MAX_PATHwartości (259 znaków dla plików, 248 dla folderów). Widziećhttp://msdn.microsoft.com/en-us/library/aa365247.aspx, aby uzyskać szczegółowe informacje.

Adam Rosenfield
źródło
4
Oto kilka faktów potwierdzających tę odpowiedź (system Windows jest zwykle ograniczony do 260 znaków): msdn.microsoft.com/en-us/library/… i blogs.msdn.com/b/bclteam/archive/2007/02/13 /…
Michael Olesen
62
Poprawny dla NTFS, niepoprawny dla Windows, zgodnie z podanym linkiem: „W interfejsie API systemu Windows (z pewnymi wyjątkami omówionymi w poniższych akapitach) maksymalna długość ścieżki wynosi MAX_PATH, która jest zdefiniowana jako 260 znaków”. Całkowita droga jest dla wszystkich celów praktycznych, ograniczone do 259 znaków (co pozwala na zerowej terminator).
Lawrence Dol
9
Najwyraźniej jeśli używasz „wersji Unicode” metod plików Windows API, możesz uzyskać do 32767, jeśli przedrostek ścieżek za pomocą „\\? \” Ma rację?
rogerdpack,
6
@rogerdpack: dla pełnej ścieżki, tak, ale każdy pojedynczy komponent (podfolder / plik końcowy) ma limit 255 punktów kodowych utf-16. Poza tym normalne oprogramowanie oczekuje MAX_PATH, więc ... bum :)
snemarch
5
W systemie Windows 10 (wersja 1607 - aktualizacja rocznicowa) i Windows Server 2016 masz opcję ignorowania problemu MAX_PATH poprzez przesłanianie pozycji zasad grupy, włącz długie ścieżki NTFS w obszarze Konfiguracja komputera -> Szablony administracyjne -> System -> System plików:
Steven Mark Ford
28

Ma 257 znaków. Mówiąc dokładniej: sam NTFS narzuca maksymalną długość nazwy pliku wynoszącą kilka tysięcy znaków (około 30'000 coś). Jednak system Windows narzuca maksymalną długość 260 dla ścieżki + nazwy pliku. Folder drive + zajmuje co najmniej 3 znaki, więc kończy się na 257.

Alphager
źródło
21
Źle - terminator NUL jest częścią MAX_PATH, co pozostawia ci maksymalną ścieżkę 256 znaków (których nie będziesz w stanie utworzyć ze względu na limit 255 pojedynczych elementów).
snemarch
4
”, którego nie będzie można utworzyć z powodu limitu 255 pojedynczych komponentów” Nieprawidłowe. Mówimy tutaj o maksymalnej długości ścieżki, a nie maksymalnej długości poszczególnych składników ścieżki. Ponadto „Podczas korzystania z interfejsu API do tworzenia katalogu określona ścieżka nie może być tak długa, aby nie można było dołączyć nazwy pliku 8.3 (to znaczy nazwa katalogu nie może przekraczać MAX_PATH minus 12).”
Ludovic Kuty
Ta debata powstaje tylko dlatego, że interfejs API niskiego poziomu pozwala na tworzenie nazw plików 256 znaków, przy założeniu, że 256 znaków jest zerowy, ale plik staje się niedostępny (ukryty) dla aplikacji natywnych, więc ogólnie nie jest użyteczny.
Conrad B
1
@LudovicKuty: w rzeczywistości OP mówił o ograniczeniu długości nazwy pliku , a nie o długości ścieżki (tak, nawet w oryginalnej wersji, sprawdziłem). I on / on bardzo konkretnie odnosił się do limitów NTFS, a nie limitów systemu operacyjnego, konkretnego podsystemu lub API lub frameworka.
0xC0000022L,
@ 0xC0000022L Tak, rzeczywiście. Źle odczytałem to w pytaniu OP i skupiłem się na komentarzach, które mówią o długości nazwy pliku i długości ścieżki.
Ludovic Kuty,
27

Oto, co mówi „Nieobsługiwany wyjątek” w środowisku 4.5 podczas próby zapisania pliku o długiej nazwie pliku:

Podana ścieżka, nazwa pliku lub oba są za długie. W pełni kwalifikowana nazwa pliku musi mieć mniej niż 260 znaków, a nazwa katalogu musi mieć mniej niż 248 znaków.

zrzut ekranu

SturmCoder
źródło
16

199 na Windows XP NTFS, właśnie sprawdziłem.

To nie jest teoria, ale po prostu przymierzanie laptopa. Mogą występować efekty łagodzące, ale fizycznie nie pozwoli mi to zwiększyć.

Zastanawiam się, czy jest jakieś inne ustawienie, które to ogranicza. Wypróbuj sam.

gołąb
źródło
1
Potwierdził to na mojej wersji XP, co za ból
Julian Young
Zrobiłem dokładnie to samo na Windows XP tylko na chichoty. Osiągnąłem limit 200 znaków. Następnie właśnie utworzyłem plik 255 razy w, usunąłem go i utworzyłem folder o tej samej nazwie w systemie Windows 7 x64. Teraz pytanie brzmi, co jest tutaj czynnikiem ograniczającym: wersja NTFS, system operacyjny lub podsystem lub interfejs API Win32 w XP?
0xC0000022L,
Limit 200 znaków wydaje się być w odkrywcy. Inne programy mogą tworzyć dłuższe nazwy plików. Jest to prawdopodobnie celowe ograniczenie, aby ocalić użytkownika przed nim samym. :-)
avl_sweden
13

Według MSDN ma 260 znaków. Obejmuje"<NUL>" niewidoczny kończący znak zerowy, więc rzeczywista długość wynosi 259.

Ale przeczytaj artykuł, jest to trochę bardziej skomplikowane.

Kibee
źródło
1
W rzeczywistości w odnośnym artykule MSDN podano, że ścieżka jest ograniczona do 260 znaków, ale długość nazwy pliku zależy od systemu plików (ale zwykle 255 bajtów). Można jednak użyć „wersji Unicode [funkcji Windows API]”, aby podnieść limit ścieżki do 32767 bajtów, ale limit ten jest zmniejszony przez wewnętrzne rozszerzenie okna \\?\ w czasie wykonywania do określonej nieokreślonej długości. Po tym rozszerzeniu ścieżka musi pozostać poniżej 32767 bajtów.
Mikko Rantalainen
13

Długość w NTFS wynosi 255. NameLengthPole w $Filenameatrybucie NTFS to bajt bez przesunięcia; daje to zakres 0-255.

Nazwa pliku może znajdować się w różnych „przestrzeniach nazw”. Do tej pory są to: POSIX, WIN32, DOS i (WIN32DOS - kiedy nazwa pliku może być natywnie nazwą DOS). (Ponieważ łańcuch ma długość, może zawierać \ 0, ale może to powodować problemy i nie znajduje się w powyższych obszarach nazw).

Dlatego nazwa pliku lub katalogu może mieć do 255 znaków. Określając pełną ścieżkę w systemie Windows, należy poprzedzić ją \\? \ (Lub użyć \\? \ UNC \ server \ share dla ścieżek UNC), aby oznaczyć tę ścieżkę jako ścieżkę o rozszerzonej długości (~ 32 tys. Znaków) . Jeśli twoja ścieżka jest dłuższa, będziesz musiał ustawić katalog roboczy po drodze (ugh - skutki uboczne ze względu na ustawienie całego procesu).

Dominik Weber
źródło
4

Dodaję to do powyższej zatwierdzonej odpowiedzi.

ABY BYĆ CZYSTY, powodem, dla którego ludzie uważają, że jest to 255-260 znaków, jest to wszystko, co obsługuje Eksplorator Windows. Błąd spowoduje zrobienie czegoś takiego jak kopia pliku na nazwach plików dłuższych niż to. Jednak program może odczytywać i zapisywać znacznie dłuższe nazwy plików (w taki sposób dochodzisz do długości, na które Explorer narzeka w pierwszej kolejności). „Zalecaną poprawką” firmy Microsoft w takich sytuacjach jest otwarcie pliku w oryginalnym programie, który go napisał, i zmiana jego nazwy.

std''OrgnlDave
źródło
Próbowałem zapisać plik głęboko w hierarchii folderów zdecydowanie przekraczający 260 znaków z wiersza poleceń za pomocą vima, ale nie powiodło się.
panny
@panny: tak więc autorzy Vima nie zadbali o to, aby zaimplementować długie nazwy ścieżek. To nie jest wina systemu Windows, ani podsystemu Win32, ani nie ma to nic wspólnego z ograniczeniem długości nazwy pliku dla NTFS, o które pytał OP.
0xC0000022L,
3

Według nowej dokumentacji zestawu Windows SDK (8.0) wydaje się, że wprowadzono nowy limit ścieżek. Istnieje nowy zestaw funkcji do obsługi ścieżek i definicja PATHCCH_MAX_CCH, jak poniżej:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000
Cplusminus_is_coming
źródło
3
Jednak Eksplorator Windows 8 (w moim przypadku podgląd Win8.1) nie działa z tym limitem i nie akceptuje ścieżek dłuższych niż 259 znaków.
Cplusminus_is_coming
3

Ta część oficjalnej dokumentacji wyraźnie mówi, że jest to 255 znaków Unicode dla NTFS, exFAT i FAT32 oraz 127 znaków Unicode lub 254 znaki ASCII dla UDF.

Poza tym maksymalna długość nazwy ścieżki wynosi zawsze 32 760 znaków Unicode, przy czym każdy składnik ścieżki nie może mieć więcej niż 255 znaków.

krakanie
źródło
Wystarczająco blisko. Jak wskazałem w komentarzu do zaakceptowanej odpowiedzi, jest to 32767 WCHARelementów. Nie, to nie są „znaki Unicode” (sprawdź terminologię Unicode: punkty kodowe, znaki itp.!).
0xC0000022L,
-2

238! Sprawdziłem to pod Win7 32 bit z następującym skryptem nietoperza:

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
źródło
Sprawdziłem to pod Windows 7 za pomocą programu, który poprawnie obsługuje długie ścieżki. Każdy segment ścieżki może zająć 255 znaków (użyłem w). Co teraz?
0xC0000022L,
-2

W rzeczywistości jest to 256, zobacz Porównanie funkcjonalności systemu plików, limity .

Aby powtórzyć post na http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

„Zakładając, że mówimy o NTFS, a nie FAT32,„ 255 znaków dla ścieżki + pliku ”jest ograniczeniem Eksploratora, a nie samego systemu plików. NTFS obsługuje ścieżki o długości do 32 000 znaków Unicode, przy czym każdy składnik może zawierać do 255 znaków.

Eksplorator - i interfejs Windows API - ogranicza ścieżkę do 260 znaków, które obejmują literę dysku, dwukropek, oddzielające ukośniki i kończący znak zerowy. Dłuższą ścieżkę można odczytać w systemie Windows, jeśli zaczniesz od \\

Jeśli przeczytasz powyższe posty, zobaczysz, że jest piąta rzecz, której możesz być pewien: Znalezienie co najmniej jednego upartego użytkownika komputera!

fane
źródło
4
Nie - jest to 255. Pole NameLength w atrybucie NTFS $ Filename jest bajtem bez przesunięcia; daje to zakres 0-255
Dominik Weber
-2

Nie mogę utworzyć pliku o nazwie + kropka + rozszerzenie w WS 2012 Explorer dłużej niż 224 znaki. Nie strzelaj do posłańca!

W CMD tego samego serwera nie mogę utworzyć nazwy dłuższej niż 235 :

System nie może odnaleźć określonej ścieżki.

Pliku o nazwie 224 znaków utworzonego w Eksploratorze nie można otworzyć w Notepad ++ - zamiast tego pojawia się nowy plik.

ajeh
źródło
The system cannot find the path specified.to nie to samo co The specified path, file name, or both are too long.. Chyba miałeś literówkę lub coś takiego. Otrzymujesz ten komunikat, jeśli próbujesz utworzyć plik w ścieżce, która nie istnieje lub jeśli chcesz przejść w kierunku, który nie istnieje.
Matthias Burger