Какую последовательность символов я не должен указывать в имени файла?

Я узнал после тестирования, что linux позволяет любому символу в имени файла, кроме / и null (\0). Итак, какую последовательность я не могу разрешить в имени файла? Я слышал, что ведущий - может запутать некоторые программы командной строки, что для меня не имеет значения, однако это может беспокоить других людей, если они решают собрать кучу файлов и фильтровать их с помощью некоторых программ GNU.

Мне было предложено удалить ведущие и конечные пробелы, и я планирую только потому, что обычно пользователь не означает иметь ведущее/конечное пространство.

Какая может быть проблематичная последовательность и какую последовательность я должен считать недопустимой? Я также рассматриваю возможность недопустимости символов в окнах просто для удобства. Я думаю, что я не могу разрешить тире в начале (тире является символом юридического окна)

Ответ 1

Ваш вопрос несколько запутан, так как вы подробно рассказываете о Linux, но затем в комментарии к другому ответу вы говорите, что вы генерируете имена файлов для загрузки людей, что, предположительно, означает, что у вас нет абсолютно никакого контроля над файловой системой и что файлы будут сохранены, что делает Linux совершенно неуместным.

В целях этого ответа я собираюсь предположить, что ваш вопрос неверен, и ваш комментарий верен.

Подавляющее большинство используемых сегодня операционных систем и файловых систем относятся примерно к трем категориям: POSIX, Windows и MacOS.

В спецификации POSIX очень четко указано, как выглядит имя файла, которое, как гарантируется, переносится во всех системах POSIX. Символы, которые вы можете использовать, определены в Раздел 3.276 (набор символов переносимого файла) базовой спецификации Open Group как:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789._-
Максимальное имя файла длина, на которую вы можете положиться, определяется в Раздел 13.23.3.5 (<limits.h> Минимальные значения) как 14. (Соответствующая константа _POSIX_NAME_MAX.)

Итак, имя файла длиной до 14 символов и содержит только 65 символов, перечисленных выше, безопасно использовать во всех совместимых с POSIX системах, что дает вам комбинации 24407335764928225040435790 (или примерно 84 бит).

Если вы не хотите раздражать своих пользователей, вы должны добавить еще два ограничения: не начинайте имя файла с тире или точки. Имена файлов, начинающиеся с точки, обычно интерпретируются как "скрытые" файлы и не отображаются в списках каталогов, если они явно не запрашиваются. И имена файлов, начинающиеся с тире, могут быть интерпретированы как опция многими командами. (Sidenote: удивительно, сколько пользователей не знают о трюках rm ./-rf или rm -- -rf.)

Это оставляет вас в 23656340818315048885345458 комбинациях (еще 84 бит).

Windows добавляет пару новых ограничений на это: имена файлов не могут заканчиваться точкой, а имена файлов нечувствительны к регистру. Это уменьшает набор символов от 65 до 39 символов (37 для первого, 38 для последнего символа). Он не добавляет ограничений длины, Windows может обрабатывать только 14 символов.

Это уменьшает возможные комбинации до 17866587696996781449603 (73 бит).

Другим ограничением является то, что Windows обрабатывает все после последней точки в качестве расширения имени файла, которое обозначает тип файла. Если вы хотите избежать потенциальной путаницы (скажем, если вы создаете имя файла, например abc.mp3 для текстового файла), вам следует избегать точек в целом.

У вас все еще есть комбинации 13090925539866773438463 (73 бит).

Если вам нужно беспокоиться о DOS, тогда применяются дополнительные ограничения: имя файла состоит из одной или двух частей (разделенных точкой), где ни одна из двух частей не может содержать точку. Первая часть имеет максимальную длину 8, вторую - 3 символа. Опять же, вторая часть обычно резервируется для указания типа файла, который оставляет вас всего 8 символов.

Теперь у вас есть 4347792138495 возможных имен файлов или 41 бит.

Хорошей новостью является то, что вы можете использовать 3-символьное расширение для фактического правильного указания типа файла, не нарушая предел имени файла POSIX (8 + 3 + 1 = 12 и 14).

Если вы хотите, чтобы ваши пользователи могли записывать файлы на CD-R, отформатированные в соответствии с ISO9660 Level 1, вам необходимо запретить дефис где угодно, а не только как первый символ. Теперь оставшийся набор символов выглядит как

ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_
, который дает вам комбинации 3512479453921 (41 бит).

Ответ 2

Я бы оставил определение "действительного" до драйвера ОС и файловой системы. Пусть пользователь вводит все, что захочет, и передает его. Обработать ошибки из ОС соответствующим образом. Исключением является то, что я считаю разумным разделять ведущие и конечные пробелы. Если люди хотят создавать имена файлов со встроенными пространствами или ведущие тире или вопросительные знаки, и их выбранная файловая система позволяет это, вам не следует пытаться их предотвратить.

Возможно монтирование различных файловых систем в разных точках подключения (или дисков в Windows), которые имеют разные правила относительно юридических символов в имени файла. Обработка такого рода вещей внутри вашего приложения будет гораздо более эффективной, чем это необходимо, потому что ОС уже сделает это за вас.

Ответ 3

Поскольку вам кажется, что вас интересует прежде всего Linux, одна вещь, которую следует избегать, это символы, которые (типичная) оболочка будет пытаться интерпретировать, например, как подстановочный знак. Вы можете создать файл с именем "*", если вы настаиваете, но у вас могут быть некоторые пользователи, которые не очень ценят его.

Ответ 4

Вы разрабатываете приложение, в котором вы должны попросить пользователя сами создавать файлы? Если это то, что вы делаете, вы можете установить правила в своем приложении. (например, разрешить [a-zA-Z0-9_.] и отклонить остальные специальные символы.) Это намного проще для обеспечения соблюдения.

Ответ 5

urlencode все строки, которые будут использоваться в качестве имен файлов, и вам нужно будет только беспокоиться о длине. Этот ответ, возможно, стоит прочитать.

Ответ 6

Я бы рекомендовал использовать набор белых списков. В общем, символы в именах файлов будут раздражать людей.

В любом случае, люди могут использовать az 0-9 и символы Unicode > 0x80, но не допускают произвольные символы, такие как и, и будут вызывать много раздражения, а также стоп-стопы в неподходящих местах.

Я думаю, что ASCII-символы, которые можно безопасно разрешить: fullstop underscore hyphen

Разрешение любых ДРУГИХ символов ascii в имени файла запрашивает проблемы.

Имя файла также не должно начинаться с символа ascii. Политика в пространствах в именах файлов сложна, так как пользователи могут рассчитывать на их использование, но некоторые имена файлов, очевидно, глупые (такие как START с пробелами)