Максимальна довжина імені файлу в NTFS (Windows XP та Windows Vista)?


261

Я розробляю таблицю бази даних, яка буде містити файли завантажених файлів. Яка максимальна довжина імені файлу в NTFS, використовуваному Windows XP або Vista?


83
Я ніколи не бачив так багато різних відповідей на те, що повинно бути простим питанням. 199, 255, 256, 257, 260, "близько 30 000", "приблизно 32 000" і "це залежить". Звичайно, є класифікатори, але це все не може бути правильно?
БезумовноВстановітьMonica

7
255, я знаю це, оскільки мені довелося створити додаток, щоб не допустити корпоративних користувачів до цього, оскільки це спричиняє проблеми на наших серверах зберігання даних.
RobertPitt

2
@RobertPitt Вам щось не вистачає. Цитата з MSDN: "Максимальна довжина шляху - MAX_PATH, яка визначається як 260 символів"
Michael Olesen

7
@ Michael9000. Я вважаю, що RobertPitt цитував обмеження імені файлу (саме про це йдеться в цьому питанні), а не обмеження шляху.
gdw2

7
NTFS взагалі НЕ обмежений MAX_PATH, оболонка Windows обмежена MAX_PATH, максимальна довжина шляху NTFS - 32k
паульма

Відповіді:


286

Окремі компоненти імені файлу (тобто кожен підкаталог по шляху та кінцеве ім'я файлу) обмежені 255 символами, а загальна довжина шляху обмежена приблизно 32 000 символів.

Однак у Windows не можна перевищувати MAX_PATHзначення (259 символів для файлів, 248 для папок). Побачитиhttp://msdn.microsoft.com/en-us/library/aa365247.aspx для отримання детальної інформації.


4
Ось ще кілька фактів, які підтверджують цю відповідь (Windows зазвичай обмежується 260 символами): msdn.microsoft.com/en-us/library/… та blogs.msdn.com/b/bclteam/archive/2007/02/13 /…
Майкл Олесен

62
Правильне для NTFS, не правильне для Windows, згідно з поданим вами посиланням: "В API Windows (за деякими винятками, обговореними в наступних параграфах) максимальна довжина шляху - MAX_PATH, яка визначається як 260 символів". Загальний шлях, для всіх практичних цілей, обмежених до 259 символів ( з урахуванням нуль-термінатор).
Лоуренс Дол

9
Мабуть, якщо ви використовуєте "версію unicode" методів файлів API Windows, ви можете отримати до 32767, якщо ви будете префіксувати імена шляхів з "\\? \", Це правда?
rogerdpack

6
@rogerdpack: для повного шляху так, але кожен окремий компонент (підпапка / заключний файл) має обмеження в 255 кодів utf-16. Плюс нормальне програмне забезпечення очікує MAX_PATH, тому ... бум :)
снімар

5
У Windows 10 (версія 1607 - ювілейне оновлення) та Windows Server 2016 у вас є можливість ігнорувати проблему MAX_PATH, замінивши запис групової політики, щоб включити довгі шляхи NTFS у налаштуваннях комп'ютера -> Шаблони адміністратора -> Система -> Файлова система:
Стівен Марк Форд

28

Це 257 символів. Якщо бути точним: сам NTFS накладає максимальну довжину імені файлу в кілька тисяч символів (приблизно 30 000 щось). Однак Windows накладає максимальну довжину 260 для імені файлу Path +. Папка Drive + містить щонайменше 3 символи, тож ви отримуєте 257.


21
Неправильно - термінатор NUL є частиною MAX_PATH, що залишає вам максимальний шлях у 256 символів (який ви не зможете створити через обмеження індивідуального компонента 255).
snemarch

4
", яку ви не зможете створити через обмеження для індивідуальних компонентів 255" Неправильно. Ми говоримо тут про максимальну довжину шляху, а не про максимальну довжину окремих компонентів шляху. Крім того, "Використовуючи API для створення каталогу, вказаний шлях не може бути таким довгим, що ви не можете додати ім'я файлу 8.3 (тобто ім'я каталогу не може перевищувати MAX_PATH мінус 12)."
Людович Куті

Ця дискусія є лише тим, що api низького рівня дозволяє створювати імена файлів 256 символів, за умови, що 256 знаків є нульовим, але файл стає недоступним (прихованим) для власних програм, тому, як правило, не є корисним.
Конрад Б

1
@LudovicKuty: насправді ОП говорив про обмеження довжини імені файлу , а не про довжину шляху (так, я навіть перевірив у початковій редакції). І він / він дуже конкретно посилався на обмеження NTFS, а не на межі ОС, певної підсистеми або API або рамки.
0xC0000022L

@ 0xC0000022L Так. Я неправильно його прочитав у питанні про ОП і зосередився на коментарях, які розповідають про довжину імені файлів та довжину шляху.
Людовик Куті

27

Ось що говорить "Не оброблений виняток" в рамках 4.5 при спробі зберегти файл із довгим ім'ям файлу:

Зазначений шлях, ім'я файлу або обидва вони занадто довгі. Повноцінне ім'я файлу має містити менше 260 символів, а ім'я каталогу - менше 248 символів.

скріншот


16

199 на Windows XP NTFS, я щойно перевірив.

Це не теорія, а лише спроба на моєму ноутбуці. Можуть бути пом'якшувальні наслідки, але фізично це не дозволить мені зробити це більшим.

Цікаво, чи існує якась інша установка, що обмежує це? Спробуйте самі.


1
Підтвердив це на моїй версії XP, який біль
Джуліан Янг

Я точно так само робив на Windows XP тільки для хихикань. Я потрапив на ліміт у 200 символів. Тоді я просто створив файл з 255 разів w, видалив його і створив папку з такою ж назвою в Windows 7 x64. Тепер питання в тому, що тут є обмежуючим фактором: версія NTFS, ОС або підсистема або API Win32 в XP?
0xC0000022L

Межа 200 символів, здається, знаходиться в провіднику. Інші програми можуть створювати довші імена файлів. Це, мабуть, навмисна межа, щоб врятувати користувача від себе. :-)
avl_sweden

13

За даними MSDN , це 260 символів. Він включає "<NUL>"-видимий невидимий завершальний нульовий символ, тому фактична довжина становить 259.

Але прочитайте статтю, це трохи складніше.


1
Власне, у статті, що посилається на MSDN, йдеться про те, що шлях обмежений 260 символами, але довжина назви файлу залежить від файлової системи (але зазвичай 255 байт). Однак можна використовувати "версії Unicode [функцій API Windows]", щоб підняти обмеження шляху до 32767 байт, але цей ліміт зменшується вікнами, що внутрішньо розширюють необхідний \\?\ префікс під час виконання до деякої не визначеної довжини. Після цього розширення шлях повинен залишатися під 32767 байтами.
Мікко Ранталайнен

13

Довжина в NTFS - 255. NameLengthПоле в $Filenameатрибуті NTFS - байт без зміщення; це дає діапазон 0-255.

Ім'я файлу iself може бути в різних "просторах імен". Поки є: POSIX, WIN32, DOS і (WIN32DOS - коли ім'я файлу може бути вихідним іменем DOS). (Оскільки рядок має довжину, він може містити \ 0, але це спричинить проблеми і не знаходиться в просторах імен, наведених вище.)

Таким чином, ім'я файлу чи каталогу може містити до 255 символів. Вказуючи повний шлях у Windows, вам потрібно встановити шлях до \\? \ (Або використовувати \\? \ UNC \ server \ share для UNC-шляхів), щоб позначити цей шлях як один із збільшеною довжиною (~ 32k символів) . Якщо ваш шлях довший, вам доведеться по дорозі встановити свою робочу директорію (тьфу - побічні ефекти через налаштування для загального процесу).




4

Я додаю це до вище затвердженої відповіді.

Щоб бути ЧИСТИМ, люди вважають, що це 255-260 символів, тому що це все, що підтримує Провідник Windows. Це дозволить зробити щось подібне до копіювання файлу з іменами файлів довше, ніж це. Однак програма може читати та записувати набагато довші імена файлів (саме так ви добираєтесь до довжин, на які Explorer скаржиться в першу чергу). Microsoft "рекомендується виправити" в таких ситуаціях, як відкрити файл у початковій програмі, яка його написала та перейменувати.


Я спробував зберегти файл в глибині ієрархії папок, яка, безумовно, перевищує 260+ символів з командного рядка з vim, але виявилася невдалою.
пані

@panny: тож автори Vim тоді не подбали про те, щоб реалізувати довгі назви шляху. У цьому не винна Windows ні підсистема Win32, ні це не має нічого спільного з обмеженням довжини імені файлу для NTFS, про який запитувала ОП.
0xC0000022L

3

Згідно з новою документацією на Windows SDK (8.0), здається, передбачено нове обмеження шляху. Існує новий набір функцій обробки траєкторії та визначення PATHCCH_MAX_CCH таким чином:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000

3
Однак провідник Windows 8 (у моєму випадку попередній перегляд Win8.1) не працює з цим обмеженням, і він не прийме шляху, довші ніж 259 символів.
Cplusminus_is_coming

3

У цій частині офіційної документації чітко сказано, що це 255 символів Unicode для NTFS, exFAT і FAT32 та 127 Unicode або 254 символів ASCII для UDF.

Крім цього, максимальна довжина імені шляху завжди становить 32 760 символів Unicode, причому кожен компонент шляху не більше 255 символів.


Достатньо близько. Як я зазначаю в коментарі до прийнятої відповіді, це 32767 WCHARелементів. Ні, це не "символи Unicode" (перевірте свою термінологію Unicode: кодові точки, символи тощо ...!).
0xC0000022L


-2

238! Я перевірив його під Win7 32 біт із наступним сценарієм bat:

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

Я перевірив це під Windows 7 програмою, яка правильно обробляє довгі шляхи. Кожен окремий сегмент шляху може містити 255 символів (я використовував w). І що тепер?
0xC0000022L

-2

Насправді це 256, див. Порівняння функціональності файлової системи, Обмеження .

Щоб повторити публікацію на http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

"Якщо припустити, що ми говоримо про NTFS, а не про FAT32," 255 символів для шляху + файл "є обмеженням Explorer, а не самої файлової системи. NTFS підтримує шляхи довжиною до 32 000 символів Unicode, з кожного компонента до 255 символів.

Провідник - і API Windows - обмежує вас на 260 символів для шляху, що включає букву диска, двокрапку, роздільну косу рису та завершальний нульовий символ. Можна прочитати довший шлях у Windows, якщо почати його з \\"

Якщо ви прочитаєте вищезгадані публікації, ви побачите, що є пете, в чому ви можете бути впевнені: Пошук хоча б одного впертого користувача комп'ютера!


4
Ні - це 255. Поле NameLength в атрибуті Filename NTFS $ є байтом без зміщення; це дає діапазон 0-255
Домінік Вебер

-2

Я не можу створити файл із іменем + період + видалення в Провіднику WS 2012 довше 224 символів. Не стріляйте в месенджера!

У CMD того ж сервера я не можу створити довше 235 імен символів:

Система не може знайти вказаний шлях.

Файл із іменем 224 символів, створений у Провіднику, неможливо відкрити в «Блокноті ++» - він просто створює новий файл.


The system cannot find the path specified.не те саме, що The specified path, file name, or both are too long.. Я здогадуюсь, ти мав друк або щось таке. Це повідомлення ви отримуєте, якщо намагаєтесь створити файл на шляху, який не існує, або якщо ви хочете перейти до напрямку, який не існує.
Маттіас Бургер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.