Имя файла не должно содержать следующих символов

Обновлено: 03.07.2024

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

Большинство операционных систем запрещают использование нулевого байта в именах файлов и резервируют «/» в качестве разделителя каталогов. Кроме того, они требуют, чтобы имена файлов были правильно закодированы для локали пользователя. На Automake распространяются эти ограничения.

Переносимые пакеты должны ограничиваться именами файлов POSIX. Они могут содержать буквы и цифры ASCII, ‘ _ ’, ‘ . ', а также ' - '. Имена файлов состоят из компонентов, разделенных символом «/». Компоненты имени файла не могут начинаться с «-».

Имена переносимых файлов POSIX не могут содержать компоненты, длина которых превышает 14 байт, но в настоящее время обычно безопасно использовать более широкое ограничение XOPEN, равное 255 байтам. POSIX ограничивает имена файлов 255 байтами (XOPEN разрешает 1023 байта), но вы можете ограничить исходный tar-архив именами файлов 99 байтами, чтобы избежать проблем совместимости со старыми версиями tar .

Если вы отступаете от этих правил (например, используете символы, отличные от ASCII, в именах файлов или используете длинные имена файлов), у ваших установщиков могут возникнуть проблемы по причинам, не связанным с Automake. Однако, если вас это не касается, вам следует знать об ограничениях, налагаемых самим Automake. Эти ограничения нежелательны, но некоторые из них кажутся присущими базовым инструментам, таким как Autoconf, Make, M4 и оболочка. Они делятся на три категории: каталоги установки, каталоги сборки и имена файлов.

Следующие символы:

не должно появляться в именах каталогов установки. Например, операнд параметра --prefix команды configure не должен содержать эти символы.

Каталоги сборки имеют те же ограничения, что и каталоги установки, и, кроме того, не должны содержать следующие символы:

Например, полное имя каталога, содержащего исходные файлы, не должно содержать этих символов.

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

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

Некоторые символы, которые вы упомянули, действительно разрешены в Windows. Проверьте это: echo abc > "ab.;,=[1]"

@DavidC.Bishop: В этом сообщении SO утверждается, что ядро ​​Linux не позволит вам работать с именем файла, содержащим косую черту. Удалось ли вам заставить это работать?

«/ не является незаконным в Linux. Вам просто нужно экранировать его с помощью \ при вводе» — это утверждение совершенно неверно. Компоненты имени файла не могут содержать /, и его экранирование не имеет никакого эффекта.

19 ответов 19

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

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

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

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

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

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

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

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

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

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

Новые строки не запрещены в Linux. Хотя я бы сказал, что они должны быть. и если NUL запрещен в Linux, то он запрещен и в Windows, он служит той же цели.

@Soaku: конечно, нет, поскольку мир не вращается вокруг Microsoft. Зачем добавлять ненужные ограничения, когда есть только два символа, которые абсолютно необходимо запретить?

@firegurafiku «/» — это просто условность — имена каталогов в любом случае хранятся отдельно друг от друга, поэтому «/» может без проблем появляться в именах (если разрешено). Если используется в имени каталога/файла внутри пути, он должен быть экранирован, но это относится и ко многим другим символам. Работа с '\0' потребует отдельного хранения длины строки везде, что на самом деле сложнее.

"В большинстве дистрибутивов Linux вы можете назвать файл с помощью косой черты." -- Нет, нельзя. '/' всегда рассматривается ядром, а не только оболочкой, как разделитель каталогов. Невозможно обойти это с помощью программы C, скрипта Python или любого другого способа.

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

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

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

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

Ключевая фраза из ссылки MSDN: «[и] любой другой символ, который не разрешен целевой файловой системой». В Windows могут быть разные файловые системы. Некоторые могут разрешать Unicode, другие — нет. Как правило, единственный безопасный способ проверить имя — попробовать его на целевом устройстве.

Есть некоторые рекомендации, и "существует бесконечное количество имен, состоящих только из допустимых запрещенных символов" неконструктивно. Точно так же «Windows не различает символы верхнего и нижнего регистра» является глупым исключением — ОП спрашивает о синтаксисе, а не о семантике, и ни один здравомыслящий человек не скажет, что имя файла например, файл A.txt был недействительным, поскольку файл .TXT может существовать.

COPY CON PRN означает чтение с клавиатуры или, возможно, стандартного ввода и копирование на принтер. Не уверен, что это все еще действует в современных окнах, но определенно было в течение длительного времени. В старые времена вы могли использовать его для ввода текста, а матричный принтер просто выводил его.

@JimBalter Если я не ошибаюсь, это неконструктивно, потому что «бесконечное количество имен, состоящих только из допустимых запрещенных символов» довольно бессмысленно, если правила для имен файлов четко определены и сами по себе не бесконечны. Ничто в этом ответе не оправдывает описание возможностей как бесконечных таким образом, чтобы это было полезно или полезно для читателя. Например. сравните следующее: (1) В Linux «/» не допускается. (2) Полное руководство для Linux невозможно, потому что существует бесконечное количество запрещенных имен, например. "/", "//", "///", "а/а", "б/б" и т. д.

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

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

Другие люди рассмотрели правила для имен файлов Windows со ссылками на Microsoft и Википедию по этой теме.

Обратите внимание, что в MacOS X файловая система нечувствительна к регистру. Текущие версии позволяют двоеточие : в именах файлов, хотя исторически это не всегда было так:

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

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

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

Первоначальный ответ: Почему при именовании файлов в Windows файл не может содержать определенные специальные символы, такие как / \ ? : *? Простой, потому что эти символы имеют другое значение для файловой системы или командной строки (где изначально были созданы правила именования файлов).

Какие символы нельзя использовать в имени файла?

Могут ли имена файлов содержать специальные символы?

Являются ли символы недопустимыми?

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

Какие из следующих символов не разрешены в имени файла в операционной системе Windows?

Не используйте следующие зарезервированные имена для имени файла: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4. , LPT5, LPT6, LPT7, LPT8 и LPT9. Также избегайте этих имен, за которыми сразу следует расширение; например, NUL.

Почему в именах файлов нельзя использовать специальные символы?

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

Каковы правила именования файла?

Рекомендации по присвоению имен файлам. Файлы должны иметь одинаковые имена. Имена файлов должны быть короткими, но описательными ( Сколько символов разрешено в именах файлов?

NTFS позволяет каждому компоненту пути (каталогу или имени файла) иметь длину 255 символов.

Как исправить неверное имя файла?

Как исправить ошибку с допустимым именем файла на OnDrive? Удалите все неподдерживаемые символы из имени файла. Переименуйте файл, который не может быть обновлен, с более коротким именем. Переименуйте папки, в которых у вас есть файл, расположенный на вашем жестком диске. Переместите файл по другому пути на вашем ПК.

Какие символы нельзя использовать при создании папки?

Они специально не разрешены, потому что у них есть другое применение: \ — зарезервировано для использования в качестве разделителя пути и escape-символа. / — зарезервировано для использования в качестве разделителя пути. : — зарезервировано для использования в качестве разделителя имени диска. * а также ? – Зарезервировано для использования в качестве подстановочных знаков. ” – зарезервировано для использования в кавычках имен, содержащих пробелы.

Как удалить специальные символы из имени файла?

Какие символы недопустимы в JSON?

Следующие символы являются зарезервированными и не могут использоваться в JSON. Для использования в строках их необходимо правильно экранировать. Backspace заменить на \b. Поток формы следует заменить на \f. Новая строка заменяется на \n. Возврат каретки заменяется на \r. Табуляцию заменить на \t.

Почему в Java недопустимый символ?

Исключение JavaScript "недопустимый символ" возникает при наличии недопустимого или неожиданного токена, который не принадлежит этой позиции в коде.

Как исправить недопустимый символ в идентификаторе?

В python, если вы запустите код, вы можете получить недопустимый символ python в ошибке идентификатора из-за некоторого символа в середине имени переменной Python, функции. Или чаще всего мы получаем эту ошибку, потому что вы скопировали какой-то форматированный код с любого веб-сайта. Чтобы устранить этот недопустимый символ в идентификаторе python 16 октября 2021 г.

Почему в именах файлов есть символы подчеркивания?

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

Какой из следующих символов нельзя использовать при именовании файла в MS Access?

Какие символы нельзя использовать в имени файла Mac?

Есть только два символа, которые вы не можете использовать: один из них — двоеточие (поскольку он используется системой).

Какой символ нельзя использовать в именах файлов в Excel?

C, c, R, r — нельзя использовать в качестве имен — Excel использует их как ярлыки для выбора.

Каких символов следует избегать в имени файла quizlet?

-При включении личного имени в имя файла сначала укажите фамилию, а затем инициалы. - Избегайте использования таких слов, как черновик или буква, в качестве начала имени файла. Вы только что изучили 6 терминов!.

Какие специальные символы не допускаются?

Вы можете называть файлы, используя практически любые символы в качестве имени, за исключением следующих зарезервированных символов: : ” / \ | ? * Максимальная длина пути — 255 символов. Это ограничение включает букву диска, двоеточие, обратную косую черту, каталоги, подкаталоги, имя файла и расширение.

Какой атрибут файла означает, что файл или папка не видны пользователю?

Скрытый (H): если установлено, указывает, что файл хостинга скрыт.Команды MS-DOS, такие как dir, и приложения Windows, такие как File Explorer, по умолчанию не отображают скрытые файлы, если только об этом не попросят.

Почему важно давать имена файлам, описательным их содержимому?

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

Какие четыре правила именования файлов и папок на вашем веб-сайте?

Рекомендации по именованию HTML-файлов и папок Имена HTML-файлов должны заканчиваться суффиксом «.html» или «.htm». Имя файла должно содержать не более 32 символов, включая суффикс файла «.html» или «.htm». Первым символом имени файла должна быть буква.

Имена файлов и пути, содержащие определенные символы или последовательности символов, могут вызвать проблемы при использовании в создании имени файла или пути:

  • Дефисы в начале: тире в начале могут вызвать проблемы, когда программы вызываются с именем файла в качестве параметра, поскольку первый символ или символы имени файла могут быть интерпретированы как переключатель параметров.
  • Управляющие символы, такие как перевод строки, возврат каретки и экранирование. Управляющие символы в имени файла могут привести к неожиданным результатам в сценариях оболочки и в ведении журнала.
  • Пробелы. Пробелы могут вызывать проблемы со сценариями, а также в случаях, когда имя файла не заключено в двойные кавычки.
  • Недопустимые кодировки символов. Кодировки символов могут затруднить правильную проверку имен файлов и путей. (См. IDS11-J. Внесите любые изменения в строку перед проверкой).
  • Префиксы пространств имен и соглашения. Префиксы пространств имен могут привести к неожиданному и потенциально небезопасному поведению, если они включены в имя пути.
  • Интерпретаторы команд, сценарии и синтаксические анализаторы: символы, имеющие особое значение при обработке командным интерпретатором, оболочкой или синтаксическим анализатором.

Пример несовместимого кода

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

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

Соответствующее решение

Используйте описательное имя файла, содержащее только ранее описанное подмножество ASCII.

Пример несовместимого кода

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

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

Соответствующее решение

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

Исключения

FIO99-J-EX0: программа может принимать имя файла или путь, в котором используются «небезопасные» символы, при условии, что разработчик определил, что файл не используется в ограниченном приемнике, таком как интерпретатор команд, оболочка, синтаксический анализатор, регистратор или другая сложная подсистема, которая придает этим символам особое значение.

Оценка рисков

Отказ от использования только безопасного подмножества ASCII может привести к неправильной интерпретации данных.

P4

L3

Автоматическое обнаружение

Сопутствующие рекомендации

Выбор имен файлов и других внешних идентификаторов [AJN]

CWE-116, неправильное кодирование или экранирование вывода

Библиография

Набор 7-битных кодированных символов ISO для обмена информацией

Часто задаваемые вопросы по UTF-8 и Unicode для UNIX/Linux




12 Комментариев

Роберт Сикорд (менеджер)

Я не могу сказать, говорит ли это правило, что следующие символы:

может или не должен использоваться в именах файлов.

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

Роберт Сикорд (менеджер)

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

Роберт Сикорд

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

  • (больше)
  • : (двоеточие)
  • " (двойные кавычки)
  • / (косая черта)
  • \ (обратная косая черта)
  • | (вертикальная полоса или труба)
  • <ли>? (вопросительный знак)
  • * (звездочка)

Вы не можете использовать двоеточие (:) в именах файлов и папок, потому что Mac OS 9 (Classic) использует этот символ для разделения каталогов в путях. Кроме того, некоторые приложения не позволяют использовать косую черту (/) в именах элементов.

Эти символы могут не поддерживаться или с ними может быть сложно работать при экспорте в определенные форматы файлов, такие как EDL, OMF или XML.

Пробелы, такие как пробелы, табуляция, перевод строки и возврат каретки (последние два встречаются редко)

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

По какой причине мы должны просто сократить этот список до букв, цифр, точек (которые необходимы для файлов 8.3) и символов '_'?

Хуан Карлос Эррера Маркетти

Ёдзо ТОДА

Я изменил ссылку, чтобы она указывала на страницу библиографии пространства C Coding Standard, но она выглядит так

Confulence распознает эту ссылку как внешний сайт, а не в другом пространстве.

кто-нибудь, пожалуйста, исправьте ссылку (два вхождения), если это необходимо.

Давид Свобода

Исключение требует дополнительной работы. Что такое ограниченный приемник в этом контексте?

Роберт Сикорд

Я немного расширил текст, в основном повторив текст из вступления.

Роберт Сикорд

Неясно, что обозначают "символы разделения пространств имен". Мое лучшее предположение таково:

Если это намерение, лучше сказать "префикс пространства имен и соглашения" или что-то в этом роде.

Роберт Сикорд

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

Это ограничение нельзя применить, просто используя безопасное подмножество ASCII.

Возможно, это должно называться «Использовать консервативные соглашения об именах файлов», что определенно является кратким, но не точным заголовком, но мы можем быть более точным в правиле, которое, я думаю, должно говорить об использовании 8.3 с этими символами "[^A-Za -z0-9._]", но не заканчиваться точкой. Даже код для проверки этого будет сложным.

Роберт Сикорд

Это правило также может принадлежать FIO, потому что создание имен файлов — это половина уравнения.

Давид Свобода

Теперь я думаю, что это правило следует понизить до рекомендательного или вообще отменить. Что следует учитывать:

Мы не можем придумать подмножество символов, безопасное для всех файловых систем. (То есть безопасный, который был бы достаточно ограниченным, был бы слишком ограничительным, чтобы быть полезным). Философия Java «напиши один раз — запускай где угодно» предает нас здесь. Здесь нам пришлось бы отказаться от независимости от платформы и сказать: уважайте ограничения имен файлов, поддерживаемые вашей файловой системой. Недостаточно сосредоточиться на платформах, а скорее на файловых системах. Вы можете смонтировать файловую систему HFS+ на компьютере с Linux, и тогда вам придется иметь дело с ограничениями имен файлов в стиле Mac на платформе Linux.

Это также относится к аналогам C и C++ этого правила (хотя они являются всего лишь рекомендациями)

Наконец, все плохие случаи, упомянутые во введении, рассматриваются другими правилами:

Дефисы в начале представляют собой проблему только в том случае, если в команде оболочки используется ненадежное имя файла, что нарушает IDS07-J. Не передавайте в метод Runtime.exec() ненадежные, непроверенные данные. То же самое относится к пробелам и управляющим символам, таким как перевод строки, возврат каретки и escape-последовательность.

Что касается недопустимых кодировок символов и префиксов пространств имен, решение хорошо рассмотрено в FIO16-J. Канонизировать имена путей перед их проверкой.

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

Роберт Сикорд

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

Читайте также: