Какую последовательность символов я не должен допустить в имени файла? - PullRequest
19 голосов
/ 21 февраля 2010

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

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

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

Ответы [ 6 ]

67 голосов
/ 21 февраля 2010

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

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

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

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

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

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

Если вы не хотите раздражать своих пользователей, вы должны добавить еще два ограничения: не начинайте имя файла с тире или точки. Имена файлов, начинающиеся с точки, обычно интерпретируются как «скрытые» файлы и не отображаются в списках каталогов без явного запроса. И имена файлов, начинающиеся с тире, могут интерпретироваться как опция многими командами. (Замечание: удивительно, сколько пользователей не знают о трюках 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). </p>

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

ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_
, что дает вам 3512479453921 комбинаций (41 бит).
6 голосов
/ 21 февраля 2010

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

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

5 голосов
/ 21 февраля 2010

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

3 голосов
/ 21 февраля 2010

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

0 голосов
/ 21 февраля 2010

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

Любыми средствами разрешается использовать a-z 0-9 и символы Юникода> 0x80, но запрещать произвольные символы, такие как & и, это будет вызывать большое раздражение, а также полные остановки в неподходящих местах.

Я думаю, что символы ASCII, которые можно разрешить, это: дефис с подчеркиванием через точку

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

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

0 голосов
/ 21 февраля 2010

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

...