Linux

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

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

Что еще я упустил?

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

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

Ответ 1

Давайте будем проще и сначала ответим на вопрос.

Запрещенными для печати символами ASCII являются:

Linux/Unix:

  1. /(прямая косая черта).

Windows:

  1. <(меньше чем).

  2. > (больше чем).

  3. :(двоеточие иногда работает, но на самом деле это NTFS Alternate Data Streams).

  4. " (двойная кавычка).

  5. / (прямая косая черта).

  6. \ (обратная косая черта).

  7. | (вертикальная полоса или труба).

  8. ? (вопросительный знак).

  9. * (звездочка).

Непечатаемые символы

Если ваши данные поступают из источника, который допускает непечатаемые символы, то их необходимо проверить.

Linux/Unix:

  1. 0 (байт NULL).

Windows:

  1. 0-31 (управляющие символы ASCII).

Примечание: Хотя в файловых системах Linux/Unix создание файлов с управляющими символами в имени файла является законным, работа с такими файлами может стать проблемой  для пользователей.

Зарезервированные имена файлов

Следующие имена файлов зарезервированы:

Windows:

  1. CON, PRN, AUX, NUL. 

  2. COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9.

  3. LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.

(как сами по себе, так и с произвольными расширениями файлов, например, LPT1.txt).

Другие правила

Windows:

  1. Имена файлов не могут заканчиваться пробелом или точкой.

macOS:

  1. Вы об этом не спрашивали, но на всякий случай: Двоеточие «:» и прямой слэш «/» в зависимости от контекста не разрешены (например, Finder поддерживает слэш, терминал двоеточие).

Ответ 2

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

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

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

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

Ответ 3

В оболочках Unix вы можете заключить в одинарные кавычки почти все символы. За исключением одинарной кавычки, и вы не можете выразить управляющие символы, потому что «\» не расширяется. Доступ к самой одинарной кавычке из строки в кавычках возможен, потому что вы можете объединять строки с одинарными и двойными кавычками, например так, «'I''''''m''», который может быть использован для доступа к файлу под названием «I'm» (здесь также возможна двойная кавычка).

Таким образом, вам следует избегать всех управляющих символов, потому что их слишком сложно вводить в оболочке. Остальное возможно, особенно файлы, начинающиеся с тире, потому что большинство команд считывают их как опции, если только перед ними не стоят два тире «--«, или вы не указываете их с помощью «./», что также скрывает начальное «-«.

Если вы хотите быть вежливым, не используйте ни один из символов, которые оболочка и типичные команды используют как синтаксические элементы, иногда зависящие от позиции, например, вы можете использовать «-«, но не как первый символ; то же самое с «.», вы можете использовать его как первый символ, только когда вы имеете в виду («скрытый файл»). Когда вы имеете в виду, ваши имена файлов представляют собой управляющие последовательности VT100.

Ответ 4

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

Схожие статьи

Linux

Как я могу измерить фактическое использование памяти приложением или процессом?

Linux

Поиск файла по содержимому в Linux. Поиск текста в файлах Linux

Linux

Как часто следует перезагружать серверы Linux?

Linux

Может ли scp рекурсивно копировать каталоги?