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


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

что еще мне не хватает?

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

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

12 236

12 ответов:

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

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

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

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

давайте держать его простым и ответить на вопрос, в первую очередь.

  1. запрещено печатные символы ASCII являются:

    • Linux / Unix:

      / (forward slash)
      
    • Windows:

      < (less than)
      > (greater than)
      : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
      " (double quote)
      / (forward slash)
      \ (backslash)
      | (vertical bar or pipe)
      ? (question mark)
      * (asterisk)
      
  2. непечатаемые символы

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

    • Linux / Unix:

      0 (NULL byte)
      
    • Windows:

      0-31 (ASCII control characters)
      

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

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

    следующие имена зарезервировано:

    • Windows:

      CON, PRN, AUX, NUL 
      COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
      LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      
  4. другие правила

    • Windows:

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

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

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

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

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


1 это был Керниган и Пайк в практика программирования кто сказал это в главе 6, тестирование, §6.5 стресс Тесты:

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

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

это не решает проблему зарезервированных имен в целевой файловой системе, но с белым списком проще снижение рисков у источника.

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

  • буквы (a-z A-Z)- символы Юникода, а также, если это необходимо
  • цифры (0-9)
  • подчеркивания (_)
  • дефис (-)
  • пробел
  • точка (.)

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

  • имя должно содержать хотя бы одну букву или цифру (чтобы избежать только точек/пробелов)
  • имя должно начинаться с буквы или цифры (чтобы избежать ведущими точками/пробелами)

это уже позволяет довольно сложные и бессмысленные имена. Например, эти имена были бы возможны с этими правилами и были бы допустимыми именами файлов в Windows / Linux:

  • A...........ext
  • B -.- .ext

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

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

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

простой способ заставить Windows сказать вам ответ-попытаться переименовать файл через Проводник и ввести / для нового имени. В Windows появится окно с сообщением о списке запрещенных символов.

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

https://support.microsoft.com/en-us/kb/177506

для Windows вы можете проверить его с помощью PowerShell

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

для отображения кодов UTF-8 вы можете конвертировать

$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference

по состоянию на 18/04/2017, среди ответов на эту тему нет простого черного или белого списка символов и имен файлов - и есть много ответов.

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

пример кода VBA:(будут добавлены позже)

хотя единственными незаконными символами Unix могут быть / и NULL, хотя некоторые соображения для интерпретации командной строки должны быть включены.

например, хотя это может быть законным именем файла 1>&2 или 2>&1 в Unix такие имена файлов могут быть неверно истолкованы при использовании в командной строке.

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

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

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

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

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

У меня была такая же потребность, и я искал рекомендации или стандартные ссылки и наткнулся на эту тему. Мой текущий черный список символов, которых следует избегать в именах файлов и каталогов:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};