Максимальная длина имени файла в NTFS (Windows XP и Windows Vista)?

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


person GateKiller    schedule 05.11.2008    source источник
comment
Я никогда не видел так много разных ответов на простой вопрос. 199, 255, 256, 257, 260, «примерно 30 000», «примерно 32 000» и «в зависимости от обстоятельств». Конечно, есть квалификаторы, но не все ли они могут быть правильными?   -  person MickeyfAgain_BeforeExitOfSO    schedule 24.08.2010
comment
его 255, я знаю это, так как мне пришлось создать приложение, чтобы корпоративные пользователи не могли этого достичь, поскольку это вызывает проблемы на наших серверах хранения.   -  person RobertPitt    schedule 21.01.2011
comment
@ Роберт Питт. Вы что-то там упускаете. Цитата из MSDN: максимальная длина пути составляет MAX_PATH, что составляет 260 символов.   -  person Michael Olesen    schedule 03.11.2011
comment
@ Michael9000. Я считаю, что Роберт Питт цитировал ограничение имени файла (об этом вопрос), а не ограничение пути.   -  person gdw2    schedule 16.11.2011
comment
подождите, это вопрос имя файла max или полный путь max (состоящий из нескольких имен файлов / имен каталогов)?   -  person rogerdpack    schedule 07.09.2012
comment
NTFS вообще НЕ ограничена MAX_PATH, оболочка Windows ограничена MAX_PATH, максимальная длина пути NTFS составляет 32 КБ   -  person paulm    schedule 28.08.2013
comment
К вашему сведению: MAX_PATH определен в minwindef.h для тех, кто его ищет. Кроме того, здесь есть другие полезные макросы.   -  person Nicholas Miller    schedule 03.11.2015
comment
@paulm: на самом деле я был бы удивлен, если бы это было ограничение NTFS. Однако некоторые ограничения в режиме ядра требуют ограничения примерно до 32k WCHAR элементов. А именно UNICODE_STRING - это проблема.   -  person 0xC0000022L    schedule 19.10.2018
comment
@rogerdpack похоже, что многие из ответивших попали именно в эту ловушку.   -  person 0xC0000022L    schedule 19.10.2018


Ответы (14)


Отдельные компоненты имени файла (т.е. каждый подкаталог по пути и окончательное имя файла) ограничены 255 символами, а общая длина пути ограничена приблизительно 32 000 символов.

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

person Adam Rosenfield    schedule 05.11.2008
comment
Вот еще несколько фактов, подтверждающих этот ответ (Windows обычно ограничивается 260 символами): msdn.microsoft.com/en-us/library/ и blogs.msdn.com/b/bclteam/archive/2007/02/13/ - person Michael Olesen; 03.11.2011
comment
Правильно для NTFS, а не для Windows, согласно предоставленной вами ссылке: В Windows API (с некоторыми исключениями, обсуждаемыми в следующих абзацах) максимальная длина пути составляет MAX_PATH, которая определяется как 260 символов. Общий путь для всех практических целей ограничен 259 символами (с учетом нулевого символа конца). - person Lawrence Dol; 14.03.2012
comment
Очевидно, если вы используете юникодную версию методов файлов Windows API, вы можете получить до 32767, если вы префикс пути с помощью \\? \, Верно? - person rogerdpack; 07.09.2012
comment
@rogerdpack: для полного пути - да, но каждый отдельный компонент (подпапка / конечный файл) имеет ограничение в 255 кодовых точек utf-16. Плюс, нормальный софт ожидает MAX_PATH, так что ... бум :) - person snemarch; 03.10.2012
comment
примерно 32000 символов - это, вероятно, 32768 символов, потому что на компьютерах числа обычно являются степенью 2 и 2 ^ 15 = 32768 - person Donald Duck; 11.07.2016
comment
В Windows 10 (версия 1607 - Anniversary Update) и Windows Server 2016 у вас есть возможность игнорировать проблему MAX_PATH, переопределив запись групповой политики, включив длинные пути NTFS в разделе Конфигурация компьютера - ›Шаблоны администратора -› Система - ›Файловая система: - person Steven Mark Ford; 11.11.2016
comment
С 260 все должно быть в порядке: msdn.microsoft.com/en-us/library/windows/desktop/ - person Tadej; 02.02.2018
comment
Проголосовали против абсолютно сомнительной рекомендации оставаться ниже MAX_PATH ... Мы уже не в 1980-х! - person 0xC0000022L; 19.10.2018
comment
@DonaldDuck: и ты ошибаешься насчет этого. Теоретический максимум составляет 65535 байт, потому что UNICODE_STRING именно так подсчитывает размер буфера. Но поскольку мы должны разделить это на sizeof(WCHAR), мы получаем 32767 (Length всегда четно в UNICODE_STRING). И даже это все еще приблизительное *, потому что внутренне имя подсистемы Win32, также известное как имя DOS, расширяется. Так что вместо C: у вас может быть \Device\HarddiskVolume11. Так что это расширение буквально уменьшает размер, который вы можете использовать из подсистемы Win32. - person 0xC0000022L; 19.10.2018
comment
К сожалению, люди до сих пор используют старые серверы, потому что ИТ не должны ничего стоить. @ 0xC0000022L. Фактически корпорации относятся к 80-м годам. - person Dragas; 15.07.2020
comment
@ Драгас, я знаю это чувство. В любом случае, первая выпущенная NT уже имела ограничение около 65 Кбайт. Чего не хватало, так это значимой поддержки в подсистеме Win32. Потребовались дополнительные усилия, чтобы заставить вашу программу использовать полную длину пути, тогда как MAX_PATH был простым способом ... - person 0xC0000022L; 15.07.2020

Это 257 символов. Чтобы быть точным: сама NTFS требует максимальной длины файла в несколько тысяч символов (около 30 000 с чем-то). Однако Windows требует максимальной длины 260 для пути + имя файла. Папка диск + занимает не менее 3 символов, поэтому в итоге получается 257.

person Alphager    schedule 05.11.2008
comment
Неправильно - терминатор NUL является частью MAX_PATH, что оставляет вам максимальный путь в 256 символов (который вы не сможете создать из-за ограничения отдельных компонентов в 255). - person snemarch; 03.10.2012
comment
которые вы не сможете создать из-за ограничения отдельных компонентов 255 Wrong. Мы говорим здесь о максимальной длине пути, а не о максимальной длине отдельных компонентов пути. Более того, при использовании API для создания каталога указанный путь не может быть настолько длинным, чтобы вы не могли добавить имя файла 8.3 (то есть имя каталога не может превышать MAX_PATH минус 12). - person Ludovic Kuty; 11.04.2014
comment
Эта дискуссия возникает только потому, что низкоуровневый api позволяет создавать имена файлов с 256 символами, исходя из предположения, что 256 символов являются пустыми, но файл становится недоступным (скрытым) для собственных приложений, поэтому обычно бесполезен. - person Conrad B; 24.02.2016
comment
@LudovicKuty: на самом деле OP говорил об ограничении длины имени файла, а не длины пути (да, даже в исходной версии я проверил). И он / она очень конкретно имел в виду ограничения NTFS, а не ограничения ОС, конкретной подсистемы, API или фреймворка. - person 0xC0000022L; 19.10.2018
comment
@ 0xC0000022L Да, действительно. Я неправильно прочитал его в вопросе OP и сосредоточился на комментариях, в которых говорится о длине имени файла и длине пути. - person Ludovic Kuty; 20.10.2018

Вот что говорит «Необработанное исключение» в framework 4.5 при попытке сохранить файл с длинным именем:

Указанный путь, имя файла или оба слишком длинные. Полное имя файла должно быть меньше 260 символов, а имя каталога - меньше 248 символов.

скриншот

person SturmCoder    schedule 12.04.2013

199 на Windows XP NTFS, я только что проверил.

Это не теория, а просто примерка на моем ноутбуке. Могут быть смягчающие эффекты, но это физически не позволит мне увеличить их.

Интересно, есть ли какие-то другие настройки, ограничивающие это? Попробуйте сами.

person dove    schedule 05.11.2008
comment
Подтвердил это на моей версии XP, какая боль - person Julian Young; 13.07.2011
comment
Я сделал то же самое на Windows XP, просто для смеха. Я достиг предела в 200 символов. Затем я просто создал файл 255 раз w, удалил его и создал папку с тем же именем в Windows 7 x64. Теперь вопрос в том, что здесь является ограничивающим фактором: версия NTFS, ОС или подсистема или Win32 API в XP? - person 0xC0000022L; 19.10.2018
comment
Ограничение в 200 символов похоже в проводнике. Другие программы могут создавать более длинные имена файлов. Вероятно, это намеренное ограничение, чтобы спасти пользователя от самого себя. :-) - person avl_sweden; 28.02.2020

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

Имя файла iself может находиться в разных «пространствах имен». Пока есть: POSIX, WIN32, DOS и (WIN32DOS - когда имя файла может быть изначально именем DOS). (Поскольку строка имеет длину, она может содержать \ 0, но это может привести к проблемам и не находится в пространствах имен выше.)

Таким образом, имя файла или каталога может содержать до 255 символов. При указании полного пути в Windows необходимо добавить к пути префикс \\? \ (или используйте \\? \ UNC \ server \ share для путей UNC), чтобы пометить этот путь как расширенный (~ 32 КБ символов). Если ваш путь длиннее, вам придется по ходу установить рабочий каталог (тьфу - побочные эффекты из-за настройки всего процесса).

person Dominik Weber    schedule 24.08.2010
comment
msdn.microsoft.com/en-us / library / - person Dercsár; 28.02.2017

Согласно MSDN, это 260 символов. Он включает "<NUL>" - невидимый завершающий нулевой символ, поэтому фактическая длина составляет 259.

Но прочтите статью, все немного сложнее.

person Kibbee    schedule 05.11.2008
comment
Фактически, в упомянутой статье MSDN говорится, что path ограничен 260 символами, но длина filename зависит от файловой системы (но обычно 255 байтов). Однако можно использовать версии Unicode [функций Windows API] для увеличения ограничения пути до 32767 байт, но этот предел уменьшается из-за того, что окна внутренне расширяют требуемый префикс \\?\ во время выполнения до некоторой неопределенной длины. После этого расширения путь не должен превышать 32767 байт. - person Mikko Rantalainen; 28.02.2018

255 символов.

http://en.wikipedia.org/wiki/Filename

person warren    schedule 05.11.2008

Я добавляю это к утвержденному выше ответу.

Чтобы быть ясным, люди считают, что это 255–260 символов, потому что это все, что поддерживает проводник Windows. Это приведет к ошибке, если вы сделаете что-то вроде копирования файла с более длинными именами файлов. Однако программа может читать и записывать гораздо более длинные имена файлов (именно так вы добираетесь до длины, на которую в первую очередь жалуется Explorer). В подобных ситуациях Microsoft рекомендует открыть файл в исходной программе, которая его написала, и переименовать.

person std''OrgnlDave    schedule 09.10.2012
comment
Я попытался сохранить файл в глубине иерархии папок, определенно превышающей 260+ символов из командной строки с помощью vim, но безуспешно. - person panny; 10.02.2013
comment
@panny: поэтому авторы Vim не позаботились о реализации длинных имен путей. Ни Windows, ни подсистема Win32 не виноваты, и это не имеет ничего общего с ограничением длины имени файла для NTFS, о котором спрашивал OP. - person 0xC0000022L; 19.10.2018

Эта часть официальной документации ясно сказано, что это 255 символов Unicode для NTFS, exFAT и FAT32 и 127 символов Unicode или 254 ASCII для UDF.

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

person caw    schedule 09.08.2018
comment
Достаточно близко. Как я указываю в комментарии к принятому ответу, это 32767 WCHAR элементов. Нет, это не символы Юникода (проверьте терминологию Юникода: кодовые точки, символы и т. Д.!). - person 0xC0000022L; 19.10.2018

Согласно новой документации 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
person Cplusminus_is_coming    schedule 11.09.2013
comment
Однако проводник Windows 8 (в моем случае Win8.1 Preview) не работает с этим ограничением и не принимает пути длиной более 259 символов. - person Cplusminus_is_coming; 11.09.2013

255 символов, хотя полный путь также не должен быть длиннее этого. Об этом есть хорошая таблица в Википедии: http://en.wikipedia.org/wiki/Filename.

person svinto    schedule 05.11.2008

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
person SzB    schedule 28.05.2015
comment
Я проверил это под Windows 7 с помощью программы, которая правильно обрабатывает длинные пути. Каждый отдельный сегмент пути мог занимать 255 символов (я использовал w). И что теперь? - person 0xC0000022L; 19.10.2018

На самом деле это 256, см. Файловая система Сравнение функциональных возможностей, ограничения.

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

«Предполагая, что мы говорим о NTFS, а не о FAT32,« 255 символов для пути + файл »- это ограничение проводника, а не сама файловая система. NTFS поддерживает пути длиной до 32000 символов Unicode, с каждым компонентом до 255 символов.

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

Если вы прочтете вышеперечисленные сообщения, то увидите, что есть пятая вещь, в которой вы можете быть уверены: найти хотя бы одного упрямого пользователя компьютера!

person fane    schedule 20.11.2009
comment
Нет - 255. Поле NameLength в атрибуте NTFS $ Filename представляет собой байт без смещения; это дает диапазон 0-255 - person Dominik Weber; 24.08.2010

Я не могу создать файл с именем + точка + расширение в WS 2012 Explorer, длина которого превышает 224 символов. Не стреляйте в посыльного!

В CMD того же сервера я не могу создать имя символа длиной более 235:

Система не может найти указанный путь.

Файл с именем из 224 символов, созданный в проводнике, не может быть открыт в Notepad ++ - вместо этого создается новый файл.

person ajeh    schedule 23.02.2018
comment
The system cannot find the path specified. - это не то же самое, что The specified path, file name, or both are too long.. Думаю, у вас была опечатка или что-то в этом роде. Вы получите это сообщение, если попытаетесь создать файл по пути, который не существует, или если вы хотите перейти в направлении, которого не существует. - person Matthias Burger; 14.05.2019