Какие символы запрещаются в именах каталогов Windows и Linux?

Я знаю, что / недопустимо в Linux, и следующее недопустимо в Windows (я думаю), * . " / \ [ ] : ; | ,

Что еще я пропускаю?

Мне нужны подробное руководство, однако, и то, которое принимает во внимание двухбайтовые символы. Соединение с внешними ресурсами меня устраивает.

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

313
задан Louis CAD 14 August 2019 в 02:49
поделиться

3 ответа

"исчерпывающее руководство" по запрещенным символам имен файлов не будет работать в Windows, так как оно резервирует как имена файлов, так и символы. Да, такие символы как * " ? и другие запрещены, но существует бесконечное число имен, состоящих только из допустимых символов, которые запрещены. Например, пробелы и точки являются допустимыми символами имен файлов, но имена, состоящие только из этих символов, запрещены.

Windows не различает символы в верхнем и нижнем регистре, поэтому вы не можете создать папку с именем A, если уже существует папка с именем a. Хуже того, такие, казалось бы, разрешенные имена, как PRN и CON, а также многие другие, зарезервированы и не разрешены. Windows также имеет несколько ограничений по длине; имя файла, действительное в одной папке, может стать недействительным, если его переместить в другую папку. Правила для наименование файлов и папок находится на MSDN.

Обычно для создания имен каталогов Windows нельзя использовать сгенерированный пользователем текст. Если вы хотите разрешить пользователям давать любые имена, вы должны создать безопасные имена, такие как A, AB, A2 и т.д., хранить сгенерированные пользователем имена и их эквиваленты путей в файле данных приложения и выполнять сопоставление путей в вашем приложении.

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

.
203
ответ дан 23 November 2019 в 01:08
поделиться

Под Linux и другими Unix...В смежных системах есть только два символа, которые не могут появиться в имени файла или директории, и это NUL '\0' и косой чертой '/'. Конечно, косая черта может отображаться в имени пути, разделяя компоненты каталога.

Ходят слухи1, что Стивен Борн (слава 'shell') имел каталог, содержащий 254 файла, по одному на каждую букву (символьный код), который может появиться в имени файла (за исключением /, '\0'; имя . было текущим каталогом, конечно же). Она использовалась для тестирования оболочки Bourne и регулярно наносила хаос на такие нежелательные программы, как программы резервного копирования.

Другие люди рассказывали о правилах Windows.

Обратите внимание, что MacOS X имеет нечувствительную к регистру файловую систему.


1 Именно Kernighan & Pike в Практика программирования сказали то же самое в Главе 6, Тестирование, §6.5 Стресс-тестировании:

Когда Стив Борн писал свою оболочку Unix (которая стала известна как оболочка Борна), он создал каталог из 254 файлов с односимвольными именами, по одному для каждого значения байта, кроме '\0' и косая черта - два символа, которые не могут появиться в именах Unix-файлов. Он использовал эту директорию для всех видов проверки соответствия шаблонов и токенов. (Каталог тестов, конечно же, создавался программой.) В течение многих лет после этого этот каталог являлся запретом для файловых трее-ходовых программ; он проверял их на уничтожение.

Обратите внимание, что каталог должен был содержать записи . и ..., так что, вероятно, это было 253 файла (и 2 каталога), или 255 записей с именами, а не 254 файла. Это не влияет ни на эффективность анекдота, ни на тщательное тестирование, которое он описывает.

62
ответ дан 23 November 2019 в 01:08
поделиться

Ну, если только в целях исследования, то лучше всего посмотреть эту запись Википедии на Filenames.

Если вы хотите написать портативную функцию для проверки вводимых пользователем данных и создать на их основе имена файлов, то короткий ответ будет не . Взгляните на портативный модуль типа Perl's File::Spec, чтобы получить представление обо всех прыжках, необходимых для выполнения такой "простой" задачи.

.
28
ответ дан 23 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: