Если вам кажется, что нет ничего проще, чем придумать имя для файла или папки, то скорее всего вы ошибаетесь. Существуют правила из-за которых нельзя назвать файл любым именем как обычный физический предмет. Для начала проясним, что такое имя файла, и как оно используется.
Понятия «путь» и «имя файла»
Очень часто в компьютерной литературе используются термины «путь» и «имя файла» под разными значениями. Обычно под словом «путь» понимают адрес или расположение файла, т. е. диск, папка и подпапки в которых расположен файл. Однако Microsoft и другие считают, что в путь к файлу входит не только его расположение но и само имя файла. А некоторые подразумевают под словом «путь» только имена файла и папок, в которых он расположен, без указания диска. Некоторые пользователи полагают, что «имя файла» не включает расширение. В данной статье расширение всегда является частью имени файла. На примере ниже синим цветом выделен путь к файлу, а красным имя файла.
X:папкаподпапка файл.расширение
Зарезервированные символы и имена
Большинство часто употребляемых символов разрешается использовать в имени файла. Имя файла не должно содержать „ ” (знак больше), „:” (двоеточие), „ «” (двойные кавычки), „ /” (слеш), „ ” (обратный слеш), „ |” (вертикальная черта), „ ?” (вопросительный знак), „ *” (звездочка), а также не может заканчиваться точкой или пробелом. Файлы также нельзя называть зарезервированными именами устройств: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, и LPT9.
Ограничения на длины имен файлов и путей
Существуют ограничения на длину имени файла и на длину пути. Абсолютное ограничение длины имени файла вместе включая путь к нему равно 260 символам. Этот предел называют термином MAX_PATH. На самом же деле на практике пределы для имен еще меньше из-за ряда других ограничений. Например, каждая строка на конце должна содержать так называемый нулевой символ, который обозначает конец строки. Несмотря на то, что маркер конца строки не отображается, он учитывается как отдельный символ при подсчете длины, а значит остается 259 символов доступных для имени файла и пути к нему. Первые три символа в пути используются для обозначения диска (например, C:). Это уменьшает предел для имен папок, подпапок и файла до 256 символов.
На имя объекта (папки или файла) наложено ограничение длины 255 символов. Этот предел действителен только, если объект не расположен внутри папки. Так как при расположении объекта внутри папки, сумма длин всех папок в которых он расположен, разделителей и имени объекта ограничена 256 символами, то предел длины самого имени объекта меньше 255 символов.
я знаю, что / является незаконным в Linux, и следующие являются незаконными в Windows (Думаю) * . " / [ ] : ; | = ,
что еще я упустил?
мне нужно полное руководство, однако, и тот, который учитывает двухбайтовые символы. Связь с внешними ресурсами меня устраивает.
мне нужно сначала создать каталог в файловой системе, используя имя что может содержат запрещенные символы, поэтому я планирую заменить эти символы подчеркивает. Затем мне нужно записать этот каталог и его содержимое в zip-файл (используя Java), поэтому любые дополнительные советы относительно имен zip-каталогов буду признателен.
12 ответов
"полное руководство" запрещенных символов имени файла не будет работать на Windows, потому что он резервирует имена файлов, а также символы. Да, такие персонажи, как * " ? и другие запрещены, но есть бесконечное число имен, состоящих только из допустимых символов, которые запрещены. Например, пробелы и точки являются допустимыми символами имени файла, но имена, состоящие только из этих символов, запрещены.
Windows не различает символы верхнего и нижнего регистров, поэтому вы не можете создать папку с именем A если один по имени a уже существует. Хуже того, казалось бы-разрешенные имена вроде PRN и CON , и многие другие, зарезервированы и не допускается. Windows также имеет несколько ограничений длины; имя файла, допустимое в одной папке, может стать недопустимым при перемещении в другую папку. Правила именование файлов и папок находится на MSDN.
вы не можете, как правило, использовать пользовательский текст для создания Каталог имен Windows. Если вы хотите разрешить пользователям называть все, что они хотят, вы должны создать безопасные имена, такие как A , AB , A2 et al., хранить созданные пользователем имена и их эквиваленты путей в файле данных приложения и выполнять сопоставление путей в приложении.
если вы абсолютно должны разрешить имена пользовательских папок, единственный способ определить, являются ли они недопустимыми, — поймать исключения и предположить, что имя недопустимо. Даже это чревато опасностью, так как исключения для запрещенного доступа, автономных дисков и вне дискового пространства перекрываются с исключениями для недопустимых имен. Ты открываешь одну огромную банку боли.
давайте держать его простым и ответить на вопрос, в первую очередь.
запрещено печатаемые символы ASCII являются:
непечатаемые символы
если ваши данные поступают из источника, который разрешил бы непечатаемые символы, то есть больше, чтобы проверить для.
Примечание: хотя в файловых системах Linux/Unix разрешено создавать файлы с управляющими символами в имени файла,это может быть кошмаром для пользователей, чтобы иметь дело с такими файлами.
зарезервированные имена файлов
следующие имена зарезервировано:
другие правила
имена файлов не могут заканчиваться пробелом или точкой.
в Linux и других системах, связанных с Unix, есть только два символа, которые не могут отображаться в имени файла или каталога, и это NUL ‘ ‘ и Слэш ‘/’ . Косая черта, конечно, может отображаться в имени пути, разделяя компоненты каталога.
слух 1 есть ли у Стивена Борна (из "shell" fame) каталог, содержащий 254 файла, по одному на каждую букву (код символа), которые могут отображаться в имени файла (исключая / , ‘ ‘ ; на имя . был текущий каталог, конечно). Он использовался для тестирования оболочки Борна и обычно наносил ущерб неосторожным программам, таким как программы резервного копирования.
другие люди покрыли правила Windows.
обратите внимание, что MacOS X имеет файловую систему без учета регистра.
1 это был Керниган и Пайк в практика программирования кто сказал это в главе 6, тестирование, §6.5 стресс Тесты:
когда Стив Борн писал свою оболочку Unix (которая стала известна как оболочка Борна), он сделал каталог из 254 файлов с односимвольными именами, по одному для каждого значения байта, кроме ‘ ‘ и Слэш, два символа, которые не могут отображаться в именах файлов Unix. Он использовал эту директорию для всевозможных тестов на соответствие шаблону и токенизацию. (Конечно, тестовый каталог был создан программой.) В течение многих лет после этого этот каталог был проклятием файл-дерево-Ходячие программы; он тестировал их до разрушения.
вместо создания черного списка символов вы можете использовать белый. Учитывая все обстоятельства, диапазон символов, которые имеют смысл в контексте имени файла или каталога, довольно короткий, и если у вас нет определенных требований к именованию, ваши пользователи не будут удерживать его против вашего приложения, если они не могут использовать всю таблицу ASCII.
это не решает проблему зарезервированных имен в целевой файловой системе, но с белым списком проще снижение рисков у источника.
в этом духе, это набор символов, которые можно считать безопасным:
- буквы (a-z A-Z) — символы Юникода, а также, если это необходимо
- цифры (0-9)
- подчеркивания (_)
- дефис (-)
- пробел
- точка (.)
и любые дополнительные безопасные символы, которые вы хотите разрешить. Помимо этого, вы просто должны применять некоторые дополнительные правила, касающиеся пробелов и точек. Этого обычно достаточно:
- имя должно содержать хотя бы одну букву или число (чтобы избежать только точек/пробелов)
- имя должно начинаться с буквы или цифры (чтобы избежать ведущими точками/пробелами)
это уже позволяет довольно сложные и бессмысленные имена. Например, эти имена были бы возможны с этими правилами и были бы допустимыми именами файлов в Windows / Linux:
по сути, даже с таким небольшим количеством белых символов вы все равно должны решить, что на самом деле имеет смысл, и проверить/настроить имя соответственно. В одном из моих приложений я использовал те же правила, что и выше, но удалил все дубликаты точек и пробелов.
Ну, если только для исследовательских целей, то вам лучше всего посмотреть эта запись Википедии о именах файлов.
Если вы хотите написать портативную функцию для проверки ввода пользователя и создания имен файлов на основе этого, короткий ответ не. Взгляните на портативный модуль, такой как Perl File:: Spec чтобы увидеть все прыжки, необходимые для выполнения такой "простой" задачи.
простой способ заставить Windows сообщить вам ответ-попытаться переименовать файл через Проводник и ввести / для нового имени. Windows появится окно сообщения, сообщающее вам список незаконных символов.
для Windows вы можете проверить его с помощью PowerShell
для отображения UTF-8 кодов вы можете конвертировать
по состоянию на 18.04.2017 среди ответов на эту тему нет простого черного или белого списка символов и имен файлов — и есть много ответов.
лучшее предложение, которое я мог придумать, — позволить пользователю назвать файл так, как ему нравится. Используя обработчик ошибок, когда приложение пытается сохранить файл, поймать какие-либо исключения, предположим, что имя файла виновато (очевидно, после того, как убедился, что путь сохранения был в порядке), и запросить у пользователя новое имя файла. Для наилучшие результаты, поместите эту процедуру проверки в цикл, который продолжается до тех пор, пока пользователь не получит его правильно или не сдастся. Работали лучше для меня (по крайней мере в VBA).
пример кода VBA:(будут добавлены позже)
хотя единственными незаконными символами Unix могут быть / и NULL , хотя некоторые соображения для интерпретации командной строки должны быть включены.
например, хотя это может быть законным именем файла 1>&2 или 2>&1 в Unix такие имена файлов могут быть неправильно истолкованы при использовании в командной строке.
аналогичным образом можно было бы назвать файл $PATH , но при попытке доступа к нему из командной строки оболочка переведет $PATH его значение переменной.
при создании ярлыков интернета в Windows, чтобы создать имя файла, он пропускает незаконные символы, за исключением косой черты, которая преобразуется в минус.
в оболочках Unix вы можете цитировать почти каждый символ в одинарных кавычках ‘ . Кроме самой одинарной кавычки, и вы не можете выражать управляющие символы, потому что не расширяется. Доступ к самой одинарной кавычке из строки с кавычками возможен, потому что вы можете объединить строки с одинарными и двойными кавычками, например ‘I’"’"’m’ который можно использовать для доступа к файлу с именем "I’m" (двойная цитата также возможна здесь).
таким образом, вы должны избегать всего контроля персонажи, потому что их слишком сложно ввести в оболочку. Остальное все еще смешно, особенно файлы, начинающиеся с тире, потому что большинство команд читают их как параметры, если у вас нет двух тире — раньше, или вы задаете их с ./ , который также скрывает начиная с — .
если вы хотите быть хорошим, не используйте ни один из символов оболочки и типичных команд, используемых в качестве синтаксических элементов, иногда зависящих от позиции, поэтому, например, вы все еще можете использовать — , но не как первый символ; то же самое с . , вы можете использовать его в качестве первого символа только тогда, когда вы имеете в виду его ("скрытый файл"). Когда вы имеете в виду, ваши имена файлов-это escape-последовательности VT100; -), так что LS искажает вывод.
У меня была такая же потребность, и я искал рекомендации или стандартные ссылки и наткнулся на эту тему. Мой текущий черный список символов, которых следует избегать в именах файлов и каталогов:
Если вы загружаете на сайт файлы (документы, изображения, архивы и пр.), и подразумевается, что доступ к этим файлам будет публичный, а не ограниченный списком избранных товарищей, нужно иметь в виду, что различные многочисленные пользователи сети интернет используют разные устройства ( настольные компьютеры, ноутбуки, планшеты, смартфоны, . ) и разные операционные системы (Mac, PC, Linux, . ).
И чтобы у всех ваши файлы адекватно открывались, отображались и скачивались, нужно перестраховаться и избегать использования в названиях файлов и каталогах сайта запрещенных символов.
Использование правильных названий для папок и файлов очень важно для web, особенно — для загружаемых файлов, таких как PDF-файлы, документы MS Word, электронные таблицы MS Excel и др.
Создавая и формируя любой документ, мы не имеем ограничений по используемым символам внутри него и можем писать в нем любые, даже запрещенные символы. Но для сохранения файла нужно присваивать ему имя с учетом некоторых правил и ограничений интернета.
Не используйте следующие запрещенные символы в названиях директорий и файлов:
# — pound (решетка) | — right angle bracket (знак "больше") | ! — exclamation point (восклицательный знак) | ` — backtick (обратная кавычка) |
& — ampersand (амперсенд) | * — asterisk (звездочка) | ‘ — single quotes (одинарные кавычки) | | — pipe (вертикальная черта) |
< — left bracket (левая фигурная скобка) | ? — question mark (вопросительный знак) | “ — double quotes (двойные кавычки) | = — equal sign (равно) |
> — right bracket (правая фигурная скобка) | / — forward slash (прямой слеш) | : — colon (двоеточие) | |
— back slash (обратный слеш) | — blank spaces (пробел) | @ — at sign (собачка) |
Не каждый сайт или сервер имеет механизм проверки файлов и, зачастую, даже если имя файла содержит запрещенные символы, вы все равно сможете загрузить его на сервер. Но вот скачать его, скорее всего, никто не сможет, особенно, через web-интерфейс.
Рассмотрим ситуацию, в которой пользователь загрузил на сайт PDF-файл, содержащий в названии символ "Решетка" (pound) — #. Сервер имеет операционную систему Linux. Поведение сервера при наличии таких символов в именах файлов будет неадекватным.
В этом случае апач считает что URL — это все, что находится перед знаком "Решетка", а все что после него — это якорь на HTML-странице, т.е. ссылка на конкретное место в HTML-документе. Соответственно, он не распознает его, как файл и не отдает пользователю.
Так как на большинстве сайтов используется автоматический Загрузчик файлов, который без лишних вопросов загружает то, что пользователь выбирает на своем компьютере. Поведение апача верное, но он не может отличить файл от html, для него всё является ссылкой, поэтому он так и будет обрабатывать.
Таким образом, нужно всего лишь не использовать символы запрещенные для имен и папок на сайте. Это самое простое в реализации.