Я знаю, что / недопустимо в Linux, и следующее недопустимо в Windows (я думаю), *
.
"
/
\
[
]
:
;
|
,
Что еще я пропускаю?
Мне нужны подробное руководство, однако, и то, которое принимает во внимание двухбайтовые символы. Соединение с внешними ресурсами меня устраивает.
Я должен сначала создать каталог в файловой системе с помощью имени, которое может содержать запрещенные символы, таким образом, я планирую заменить те символы символами нижнего подчеркивания. Я затем должен записать этот каталог и его содержание к zip-файлу (использующий Java), таким образом, любой дополнительный совет относительно названий каталогов zip ценился бы.
"исчерпывающее руководство" по запрещенным символам имен файлов не будет работать в Windows, так как оно резервирует как имена файлов, так и символы. Да, такие символы как
*
"
?
и другие запрещены, но существует бесконечное число имен, состоящих только из допустимых символов, которые запрещены. Например, пробелы и точки являются допустимыми символами имен файлов, но имена, состоящие только из этих символов, запрещены.
Windows не различает символы в верхнем и нижнем регистре, поэтому вы не можете создать папку с именем A
, если уже существует папка с именем a
. Хуже того, такие, казалось бы, разрешенные имена, как PRN
и CON
, а также многие другие, зарезервированы и не разрешены. Windows также имеет несколько ограничений по длине; имя файла, действительное в одной папке, может стать недействительным, если его переместить в другую папку. Правила для
наименование файлов и папок
находится на MSDN.
Обычно для создания имен каталогов Windows нельзя использовать сгенерированный пользователем текст. Если вы хотите разрешить пользователям давать любые имена, вы должны создать безопасные имена, такие как A
, AB
, A2
и т.д., хранить сгенерированные пользователем имена и их эквиваленты путей в файле данных приложения и выполнять сопоставление путей в вашем приложении.
Если вы обязательно должны разрешить сгенерированные пользователем имена папок, единственный способ определить, являются ли они недействительными - это поймать исключения и предположить, что имя является недействительным. Даже это чревато опасностью, так как исключения, брошенные для запрещенного доступа, автономных дисков и из дискового пространства перекрываются с теми, которые могут быть брошены для недействительных имен. Вы открываете одну огромную банку опасности
. Под Linux и другими Unix...В смежных системах есть только два символа, которые не могут появиться в имени файла или директории, и это NUL '\0'
и косой чертой '/'
. Конечно, косая черта может отображаться в имени пути, разделяя компоненты каталога.
Ходят слухи1, что Стивен Борн (слава 'shell') имел каталог, содержащий 254 файла, по одному на каждую букву (символьный код), который может появиться в имени файла (за исключением /
, '\0'
; имя .
было текущим каталогом, конечно же). Она использовалась для тестирования оболочки Bourne и регулярно наносила хаос на такие нежелательные программы, как программы резервного копирования.
Другие люди рассказывали о правилах Windows.
Обратите внимание, что MacOS X имеет нечувствительную к регистру файловую систему.
Когда Стив Борн писал свою оболочку Unix (которая стала известна как оболочка Борна), он создал каталог из 254 файлов с односимвольными именами, по одному для каждого значения байта, кроме
'\0'
и косая черта - два символа, которые не могут появиться в именах Unix-файлов. Он использовал эту директорию для всех видов проверки соответствия шаблонов и токенов. (Каталог тестов, конечно же, создавался программой.) В течение многих лет после этого этот каталог являлся запретом для файловых трее-ходовых программ; он проверял их на уничтожение.
Обратите внимание, что каталог должен был содержать записи .
и ...
, так что, вероятно, это было 253 файла (и 2 каталога), или 255 записей с именами, а не 254 файла. Это не влияет ни на эффективность анекдота, ни на тщательное тестирование, которое он описывает.
Ну, если только в целях исследования, то лучше всего посмотреть эту запись Википедии на Filenames.
Если вы хотите написать портативную функцию для проверки вводимых пользователем данных и создать на их основе имена файлов, то короткий ответ будет не . Взгляните на портативный модуль типа Perl's File::Spec, чтобы получить представление обо всех прыжках, необходимых для выполнения такой "простой" задачи.
.