Я знаю, что / является незаконным в Linux, и следующие недопустимы в Windows (я думаю) *
.
"
/
\
[
]
:
;
|
,
Что еще мне не хватает?
Однако мне нужно подробное руководство, учитывающее двухбайтовые символы. Связывание с внешними ресурсами хорошо для меня.
Мне нужно сначала создать каталог в файловой системе, используя имя, которое может содержать запрещенные символы, поэтому я планирую заменить эти символы подчеркиванием. Затем мне нужно записать этот каталог и его содержимое в zip-файл (с использованием Java), поэтому любые дополнительные советы, касающиеся имен zip-каталогов, будут оценены.
echo abc > "ab.;,=[1]"
Ответы:
«Полное руководство» по запрещенным символам имени файла не будет работать в Windows, поскольку оно резервирует имена файлов и символы. Да, такие символы, как
*
"
?
и другие, запрещены, но существует бесконечное количество имен, состоящих только из допустимых символов, которые запрещены. Например, пробелы и точки являются допустимыми символами имени файла, но имена, состоящие только из этих символов, запрещены.Windows не различает прописные и строчные буквы, поэтому вы не можете создать папку с именем,
A
если онаa
уже существует. Хуже того, вроде бы разрешенные имена, такие какPRN
иCON
многие другие, зарезервированы и не разрешены. Windows также имеет несколько ограничений по длине; имя файла, допустимое в одной папке, может стать недействительным при перемещении в другую папку. Правила именования файлов и папок приведены в документации Microsoft.Как правило, вы не можете использовать пользовательский текст для создания имен каталогов Windows. Если вы хотите , чтобы позволить пользователям имя все , что они хотят, вы должны создать безопасные имена , как
A
,AB
, иA2
др., Хранить пользовательские сгенерированные имена и их эквиваленты в пути файла данных приложения, а также выполнять отображение пути в приложении.Если вам абсолютно необходимо разрешить сгенерированные пользователем имена папок, единственный способ определить, являются ли они недействительными, - это перехватить исключения и предположить, что имя недействительно. Даже это чревато опасностью, поскольку исключения, создаваемые для отказа в доступе, отключенных дисков и нехватки дискового пространства, пересекаются с теми, которые могут быть выброшены для недопустимых имен. Вы открываете одну огромную банку боли.
источник
A.txt
был недействительным , потому чтоa.TXT
может существовать.COPY CON PRN
означает чтение с ввода с клавиатуры или, возможно, стандартного ввода и копирование его на устройство принтера. Не уверен, что это все еще действует на современных окнах, но, безусловно, было в течение длительного времени. В старые времена вы могли использовать его для ввода текста, а матричный принтер просто выводил его.Давайте будем проще и ответим сначала на вопрос.
Запрещенные печатные символы ASCII :
Linux / Unix:
Окна:
Непечатные символы
Если ваши данные поступают из источника, который разрешает непечатные символы, есть еще что проверить.
Linux / Unix:
Окна:
Примечание. Хотя в файловых системах Linux / Unix разрешено создавать файлы с управляющими символами в имени файла, пользователям может показаться кошмарным иметь дело с такими файлами .
Зарезервированные имена файлов
Следующие имена файлов зарезервированы:
Окна:
(как самостоятельно, так и с произвольными расширениями файлов, например
LPT1.txt
).Другие правила
Окна:
Имена файлов не могут заканчиваться пробелом или точкой.
источник
В Linux и других Unix-системах есть только два символа, которые не могут появиться в имени файла или каталога, и это NUL
'\0'
и косая черта'/'
. Разумеется, косая черта может появляться в имени пути, разделяющем компоненты каталога.Слух 1 гласит, что Стивен Борн (из «оболочки» славы) был каталог , содержащий 254 файлов, по одному для каждой буквы (код символа) , который может появиться в имени файла ( за исключением
/
,'\0'
; имя.
было текущим, конечно ). Он использовался для тестирования оболочки Bourne и регулярно наносил ущерб неосторожным программам, таким как программы резервного копирования.Другие люди рассмотрели правила Windows.
Обратите внимание, что MacOS X имеет регистронезависимую файловую систему.
1 Керниган и Пайк из «Практики программирования» так и сказали в главе 6 «Тестирование», §6.5 Стресс-тесты:
Обратите внимание, что каталог должен содержать записи
.
и..
, следовательно, это было, вероятно, 253 файла (и 2 каталога) или 255 записей имени, а не 254 файла. Это не влияет на эффективность анекдота или тщательное тестирование, которое он описывает.источник
/
в названии. Это вызвало некоторые проблемы, так как он создал новый каталог со схемой.PATH
переменную Unix, поскольку в качестве разделителя используется двоеточие (точка с запятой в Windows). Таким образом, программы в таком каталоге должны выполняться либо с путем, который указывает, где он находится (может быть относительным или абсолютным), либо вы должны находиться в каталоге и иметь точку (.
текущий каталог), вPATH
которой это широко рассматривается как небезопасно.Вместо того, чтобы создавать черный список символов, вы можете использовать белый список . Учитывая все это, диапазон символов, который имеет смысл в контексте имен файлов или каталогов, довольно мал, и если у вас нет особых требований к именованию, ваши пользователи не будут применять его к вашему приложению, если они не смогут использовать всю таблицу ASCII.
Это не решает проблему зарезервированных имен в целевой файловой системе, но с белым списком легче снизить риски в источнике.
В этом духе это ряд символов, которые можно считать безопасными:
И любые дополнительные безопасные символы, которые вы хотите разрешить. Помимо этого, вы просто должны применить некоторые дополнительные правила, касающиеся пробелов и точек . Этого обычно достаточно:
Это уже позволяет довольно сложные и бессмысленные имена. Например, эти имена будут возможны с этими правилами, и будут действительными именами файлов в Windows / Linux:
A...........ext
B -.- .ext
По сути, даже с таким количеством символов в белом списке вы все равно должны решить, что на самом деле имеет смысл, и соответствующим образом проверить / скорректировать имя. В одном из моих приложений я использовал те же правила, что и выше, но удалил дублирующиеся точки и пробелы.
источник
Самый простой способ получить ответ от Windows - это попытаться переименовать файл через Проводник и ввести / для нового имени. Windows выдаст сообщение о недопустимых символах.
https://support.microsoft.com/en-us/kb/177506
источник
Ну, если только для исследовательских целей, тогда вам лучше всего взглянуть на эту запись в Википедии об именах файлов .
Если вы хотите написать переносную функцию для проверки ввода пользователя и создания имен файлов на основе этого, краткий ответ - нет . Взгляните на переносимый модуль, такой как Perl File :: Spec, чтобы увидеть все прыжки, необходимые для выполнения такой «простой» задачи.
источник
Для Windows вы можете проверить это с помощью PowerShell
Для отображения кодов UTF-8 вы можете конвертировать
источник
В Windows 10 (2019) следующие символы запрещены ошибкой при попытке их набрать:
источник
Вот реализация ac # для окон, основанная на ответе Кристофера Оезбека
Он был сделан более сложным с помощью логического метода containsFolder, но, надеюсь, охватывает все
источник
StringBuilder
с начальным значением емкости? 2. Почему вы добавили 12 к длинеfilename
? 3. Было ли выбрано 12 произвольно или за этим числом была какая-то мысль?По состоянию на 18/04/2017 среди простых ответов на эту тему нет простого черного или белого списка символов и имен файлов - и ответов много.
Лучшее предложение, которое я мог придумать, состояло в том, чтобы позволить пользователю называть файл так, как ему нравится. Используя обработчик ошибок, когда приложение пытается сохранить файл, перехватите все исключения, предположите, что виновато имя файла (очевидно, после того, как убедитесь, что путь сохранения тоже был в порядке), и запросите у пользователя новое имя файла. Для достижения наилучших результатов поместите эту процедуру проверки в цикл, который продолжается до тех пор, пока пользователь не поймет это правильно или не сдается. Лучше всего сработало для меня (по крайней мере, в VBA).
источник
Хотя единственные недопустимые символы Unix могут быть
/
иNULL
, хотя следует учитывать некоторые аспекты интерпретации командной строки.Например, хотя имя файла
1>&2
или2>&1
Unix может быть законным , такие имена файлов могут быть неверно истолкованы при использовании в командной строке.Точно так же можно было бы назвать файл
$PATH
, но при попытке доступа к нему из командной строки оболочка преобразуется$PATH
в значение переменной.источник
$'myvalueis'
, например:$ echo 'hi' > $'2>&1'
,cat 2\>\&1
«привет»Трудности с определением, что законно, а что нет, уже были рассмотрены, и были предложены белые списки . Но Windows поддерживает более чем 8-битные символы. Википедия утверждает , что (например)
Поэтому я хочу представить гораздо более либеральный подход с использованием символов Unicode вместо «нелегальных». Я нашел результат в моем сопоставимом сценарии использования гораздо более читабельным. Посмотрите, например, в этот блок . Плюс вы можете даже восстановить оригинальный контент из этого. Возможные варианты и исследования представлены в следующем списке:
U+002A * ASTERISK
) вы можете использовать один из множества перечисленных, например,U+2217 ∗ (ASTERISK OPERATOR)
илиFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(альтернативы см. Здесь )/ SOLIDUS U+002F
) вы можете использовать∕ DIVISION SLASH U+2215
(другие здесь )\ U+005C Reverse solidus
) вы можете использовать⧵ U+29F5 Reverse solidus operator
( больше )U+005B Left square bracket
) и ](U+005D Right square bracket
) вы можете использовать, например,U+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
иU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
( отсюда , больше возможностей здесь )U+2236 ∶ RATIO (for mathematical usage)
илиU+A789 ꞉ MODIFIER LETTER COLON
(см. Двоеточие (буква) , иногда используемое в именах файлов Windows, поскольку оно идентично двоеточию в шрифте Segoe UI, используемом для имен файлов. Сам двоеточие не разрешено) (см. Здесь )U+037E ; GREEK QUESTION MARK
(см. Здесь )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
илиU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Википедия ). Также символы рисования коробки содержат различные другие опции., U+002C COMMA
) вы можете использовать, например‚ U+201A SINGLE LOW-9 QUOTATION MARK
(см. Здесь )U+003F ? QUESTION MARK
), они являются хорошими кандидатами:U+FF1F ? FULLWIDTH QUESTION MARK
илиU+FE56 ﹖ SMALL QUESTION MARK
(от него повторно , два больше от Дингбаты блока , поиск «вопрос»)источник
При создании ярлыков Интернета в Windows для создания имени файла пропускаются недопустимые символы, кроме косой черты, которая преобразуется в минус.
источник
В оболочках Unix вы можете заключать в кавычки практически всех символов
'
. За исключением самой одиночной кавычки, и вы не можете выразить управляющие символы, потому что\
не раскрывается. Доступ к самой одиночной кавычке из строки в кавычках возможен, потому что вы можете объединять строки с одинарными и двойными кавычками, например,'I'"'"'m'
которые можно использовать для доступа к файлу с именем"I'm"
(двойная кавычка также возможна здесь).Поэтому вам следует избегать всех управляющих символов, поскольку их слишком сложно ввести в оболочку. Остальное по-прежнему забавно, особенно файлы, начинающиеся с тире, потому что большинство команд считывают их как опции, если у вас нет двух тире
--
раньше или вы не указали их./
, что также скрывает начало-
.Если вы хотите быть милым, не используйте никаких символов, которые оболочка и типичные команды используют в качестве синтаксических элементов, иногда зависящих от позиции, так что, например, вы все еще можете использовать
-
, но не как первый символ; То же самое.
, вы можете использовать его в качестве первого символа только тогда, когда вы имеете в виду («скрытый файл»). Когда вы имеете в виду, ваши имена файлов являются escape-последовательностями VT100 ;-), так что ls искажает вывод.источник
У меня была такая же потребность, я искал рекомендации или стандартные ссылки и наткнулся на эту ветку. Мой текущий черный список символов, которых следует избегать в именах файлов и каталогов:
источник
@
в списке?b
? лол, я предполагаю, что это b изlank spaces
... ну, это все еще оставляет немного ... Я переименовал картинку,(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
но пришлось изменить ее обратно, потому что она выглядела злой ...