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

261

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

GateKiller
источник
83
Я никогда не видел так много разных ответов на простой вопрос. 199, 255, 256, 257, 260, «около 30 000», «примерно 32 000» и «это зависит». Конечно, есть классификаторы, но они не могут быть правы, не так ли?
MickeyfAgain_BeforeExitOfSO
7
это 255, я знаю это, поскольку мне нужно было создать приложение, чтобы корпоративные пользователи не могли этого достичь, так как это вызывает проблемы на наших серверах хранения.
Роберт Питт
2
@RobertPitt. Вам чего-то не хватает там. Цитата из MSDN: «Максимальная длина пути - MAX_PATH, которая определяется как 260 символов»
Майкл Олесен
7
@ Michael9000. Я полагаю, что RobertPitt цитировал ограничение имени файла (о чем этот вопрос), а не ограничение пути.
gdw2
7
NTFS НЕ ограничен MAX_PATH вообще, оболочка Windows ограничена MAX_PATH, максимальная длина пути NTFS составляет
32 КБ

Ответы:

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, согласно предоставленной вами ссылке: «В Windows API (с некоторыми исключениями, обсуждаемыми в следующих параграфах) максимальная длина пути равна MAX_PATH, которая определена как 260 символов». Общий путь, для всех практических целей, ограниченных до 259 символов ( с учетом нуль-терминатор).
Лоуренс Дол
9
Очевидно, что если вы используете «Unicode-версию» методов файлов Windows API, вы можете получить до 32767, если вы префиксируете имена путей с «\\? \», Верно?
rogerdpack
6
@rogerdpack: для полного пути, да, но каждый отдельный компонент (подпапка / конечный файл) имеет ограничение в 255 кодовых точек utf-16. Кроме того, нормальное программное обеспечение ожидает MAX_PATH, так что ... бум :)
snemarch
5
В Windows 10 (версия 1607 - Anniversary Update) и Windows Server 2016 вам кажется, что есть возможность игнорировать проблему MAX_PATH путем переопределения записи групповой политики, включающей длинные пути NTFS в разделе «Конфигурация компьютера» -> «Шаблоны администратора» -> «Система» -> «Файловая система»:
Стивен Марк Форд
28

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

Alphager
источник
21
Неверно - терминатор NUL является частью MAX_PATH, что дает вам максимальный путь в 256 символов (который вы не сможете создать из-за ограничения для отдельных компонентов в 255).
snemarch
4
«который вы не сможете создать из-за ограничения в 255 для отдельных компонентов» Неправильно. Мы говорим здесь о максимальной длине пути, а не максимальной длине отдельных компонентов пути. Более того, «При использовании API для создания каталога указанный путь не может быть настолько длинным, что вы не сможете добавить имя файла 8.3 (то есть имя каталога не может превышать MAX_PATH минус 12)».
Людовик Куты
Эта дискуссия возникает только потому, что API низкого уровня позволяет создавать имена файлов с 256 символами, исходя из предположения, что символ 256 равен нулю, но файл становится недоступным (скрытым) для собственных приложений, поэтому, как правило, бесполезен.
Конрад Б
1
@LudovicKuty: на самом деле ОП говорил об ограничении длины имени файла , а не о длине пути (да, даже в исходной ревизии я проверял). И он / она очень конкретно имел в виду ограничения NTFS, а не ограничения ОС, конкретной подсистемы, API или инфраструктуры.
0xC0000022L
@ 0xC0000022L Да, действительно. Я неправильно понял это в вопросе OP и сосредоточился на комментариях, которые говорят о длине имени файла и пути.
Людовик Куты
27

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

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

Скриншот

SturmCoder
источник
16

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

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

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

голубь
источник
1
Подтвердил это на моей версии XP, какая боль
Джулиан Янг
Я сделал то же самое на Windows XP только для хихиканья. Я достиг предела в 200 символов. Затем я просто создал файл 255 раз w, удалил его и создал папку с таким же именем в Windows 7 x64. Теперь вопрос в том, что является здесь ограничивающим фактором: версия NTFS, ОС или подсистема или Win32 API в XP?
0xC0000022L
Ограничение в 200 символов, похоже, в проводнике. Другие программы могут создавать более длинные имена файлов. Это, вероятно, преднамеренное ограничение, чтобы спасти пользователя от него самого. :-)
avl_sweden
13

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

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

Kibbee
источник
1
На самом деле, в упомянутой статье MSDN говорится, что путь ограничен 260 символами, но длина имени файла зависит от файловой системы (но обычно 255 байтов). Тем не менее, можно использовать «версии Unicode [функций Windows API]», чтобы увеличить ограничение пути до 32767 байт, но это ограничение уменьшается за счет того, что окна внутренне расширяют требуемый \\?\ префикс во время выполнения до некоторой неопределенной длины. Путь должен оставаться ниже 32767 байт после этого расширения.
Микко Ранталайнен
13

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

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

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

Доминик Вебер
источник
4

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

ЧТОБЫ ПРОЧИТАТЬ, причина, по которой люди считают, что это 255-260 символов, в том, что это все, что поддерживает Windows Explorer. Он будет ошибочно делать что-то вроде копии файла с именами файлов длиннее. Тем не менее, программа может читать и записывать гораздо более длинные имена файлов (именно так вы получаете длины, на которые в первую очередь жалуется Explorer). «Рекомендуемое исправление» Microsoft в подобных ситуациях - открыть файл в исходной программе, в которой он был написан, и переименовать его.

std''OrgnlDave
источник
Я попытался сохранить файл в глубине иерархии папок, определенно превышающий 260+ символов из командной строки, с помощью vim, но безуспешно.
Панни
@panny: поэтому авторы Vim не позаботились о реализации длинных имен путей. Это не вина Windows и не подсистема Win32, и она не имеет ничего общего с ограничением длины имени файла для NTFS, о котором спрашивал OP.
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
Cplusminus_is_coming
источник
3
Однако проводник Windows 8 (в моем случае Win8.1 Preview) не работает с этим ограничением, и он не будет принимать пути длиннее 259 символов.
Cplusminus_is_coming
3

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

Кроме того, максимальная длина имени пути всегда составляет 32 760 символов Юникода, причем каждый компонент пути не должен превышать 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
SZB
источник
Я проверил это под Windows 7 с программой, которая правильно обрабатывает длинные пути. Каждый отдельный сегмент пути может занимать 255 символов (я использовал w). И что теперь?
0xC0000022L
-2

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

Повторить пост на http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

«Предполагая, что мы говорим о NTFS, а не FAT32,« 255 символов для пути + файл »является ограничением для обозревателя, а не для самой файловой системы. NTFS поддерживает пути длиной до 32 000 символов Юникода, причем каждый компонент имеет длину до 255 символов.

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

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

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

Я не могу создать файл с именем + period + extnesion в WS 2012 Explorer длиной более 224 символов. Не стреляйте в курьера!

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

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

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

ajeh
источник
The system cannot find the path specified.это не то же самое, что The specified path, file name, or both are too long.. Я думаю, у вас была опечатка или что-то. Это сообщение появляется, если вы пытаетесь создать файл по несуществующему пути или если вы хотите перейти в несуществующее направление.
Матиас Бургер