Какие символы недопустимы для имени файла MS-DOS?

4182
My life is a bug.

Я пишу процедуру ввода-вывода с именем файла на ассемблере x86-16. Он берет восемь символов (мне не нужно поддерживать длинные имена файлов) с клавиатуры и печатает их в поле ввода текста на экране.

На данный момент я допускаю цифры, прописные / строчные буквы, подчеркивания и дефисы.

Я хотел бы разрешить все юридические символы, но я не могу найти официальный список запрещенных символов. Здравый смысл подсказывает мне, что косые черты незаконны, но если бы мне пришлось угадывать, я бы сказал, что символ «плюс» является законным. (редактировать: это не так!)

Я уже игнорирую символ точки, так как мой код автоматически обрабатывает добавление точки и расширения файла.

16
Вы также можете найти [retrocomputing.se] полезным. Bob 6 лет назад 17
Попробуйте создать папку в Windows и поставить '?' во имя. Подсказка говорит вам, какие символы запрещены. Это дает вам начало :) Mixxiphoid 6 лет назад 0
@Mixxiphoid, который не будет работать, потому что набор разрешенных символов в Windows намного больше. Например, `+ ,; []`, пробел и `az` разрешены в Windows, но не в DOS. Проводник выдает мне сообщение об ошибке «Имя файла не может содержать ни одного из следующих символов` \ /: *? »<> |`, Которое является лишь подмножеством запрещенных символов в DOS phuclv 6 лет назад 0
@phuclv, поэтому я сказал: «Это дает вам начало», а также почему это комментарий, а не ответ. Mixxiphoid 6 лет назад 1
Почему все символы MS-DOS? Почему бы также не рассмотреть другие старые правила ОС? jpmc26 6 лет назад 0

4 ответа на вопрос

29
phuclv

Краткое резюме можно найти в Википедии :

Допустимые символы для имен файлов DOS включают следующее:

  • Прописные буквы A-Z
  • Числа 0-9
  • Пробел (хотя завершающие пробелы в базовом имени или расширении считаются дополнением, а не частью имени файла, также имена файлов с пробелами в них должны быть заключены в кавычки для использования в командной строке DOS, и если DOS Команда построена программно, имя файла должно быть заключено в четверные кавычки при просмотре в качестве переменной в программе, создающей команду DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Значения 128–255 (хотя, если службы NLS активны в DOS, некоторые символы, интерпретируемые как строчные буквы, недопустимы и недоступны)

Это исключает следующие символы ASCII:

  • " * +, / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS не имеет escape-символа оболочки
  • .(U + 002E. Полная остановка) в полях имени и расширения, кроме как в. и .. записи (см. ниже)
  • Строчные буквы a- z(сохраняются как A – Z на FAT12 / FAT16)
  • Управляющие символы 0–31
  • Значение 127 (DEL) [сомнительно - обсудить]

https://en.wikipedia.org/wiki/8.3_filename#Directory_table

И вот что официально сказано в руководстве пользователя MS-DOS 6

Именование файлов и каталогов

Каждый файл и каталог, кроме корневого каталога на каждом диске, должен иметь имя. В следующем списке приведены правила именования файлов и каталогов. Имена файлов и каталогов:

  • Может быть длиной до восьми символов. Кроме того, вы можете включить расширение длиной до трех символов.
  • Не чувствительны к регистру. Не имеет значения, используете ли вы прописные или строчные буквы при их наборе.
  • Может содержать только буквы от A до Z, цифры от 0 до 9 и следующие специальные символы: underscore ( _), caret ( ^), знак доллара ( $), tilde ( ~), восклицательный знак ( !), знак числа ( #), знак процента ( %), амперсанд ( &), дефис ( -), фигурные скобки ( {}), знак ( @), одинарные кавычки ( `), апостроф ( ') и скобки (). Другие специальные символы не допускаются.
  • Не может содержать пробелы, запятые, обратную косую черту или точки (кроме периода, отделяющего имя от расширения).
  • Не может быть идентичным имени другого файла или подкаталога в том же каталоге.

Это из PC-DOS 7:

Имя, которое вы назначаете файлу, должно соответствовать следующим критериям:

  • Он может содержать не более восьми символов.
  • Он может состоять из букв от A до Z, цифр от 0 до 9 и следующих специальных символов:

    _ underscore ^ caret $ dollar sign ~ tilde ! exclamation point # number sign % percent sign & ampersand - hyphen {} braces @ at sign ` single quote ' apostrophe () parentheses 

Примечание. Другие специальные символы не допускаются.

  • Имя не может содержать пробелы, запятые, обратную косую черту или точки (кроме периода, отделяющего имя от расширения).
  • Имя не может быть одним из следующих зарезервированных имен файлов: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL и PRN.
  • Это не может быть тем же именем, что и другой файл в каталоге.

Руководство пользователя - ПК DOS 7

Первый байт имени не должен быть 0x20 (пробел). Короткие имена или расширения дополняются пробелами. Специальные символы ASCII 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3a ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) не допускаются.

Файловая система FAT

Если вы также заинтересованы в MS-DOS 5.0, то вот она .

Возможно, стоит отметить, что, хотя они содержат только допустимые символы, специальные имена файлов `CON`,` PRN`, `AUX`,` NUL`, `COM1`,` COM2`, `COM3`,` COM4`, `COM5 `,` COM6`, `COM7`,` COM8`, `COM9`,` LPT1`, `LPT2`,` LPT3`, `LPT4`,` LPT5`, `LPT6`,` LPT7`, `LPT8`, и `LPT9` также не разрешены (см. [здесь] (https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file)) Thomas Schremser 6 лет назад 11
@ThomasSchremser «Не использовать», «Избегать» и «Не рекомендуется» не то же самое, что «не разрешено». RobIII 6 лет назад 3
@RobIII Да, но они связаны с документацией «Windows> Desktop», а не с документацией «MS-DOS». [Вики для DOS] (https://en.wikipedia.org/wiki/DOS#Reserved_device_names) гласит: «В DOS есть зарезервированные имена устройств, которые нельзя использовать в качестве имен файлов независимо от расширения, поскольку они заняты встроенным символьные устройства ". Другими словами, не допускается в DOS и некоторых версиях Windows и не рекомендуется в других версиях Windows. Quantic 6 лет назад 1
Интересно, что `упоминается как одиночная кавычка. Я всегда слышал, что это называется обратным ударом, а '(то, что они называют (не неправильно) апострофом) как одиночная кавычка. ale10ander 6 лет назад 0
@ ale10, да, это меня удивило. Я всегда ненавидел то, что многие люди используют его для апострофа (как в I \ `m) или для начала части цитаты. Например, в документации GNU всегда пишется «вот так», что для меня очень некрасиво и менее читабельно phuclv 6 лет назад 2
Интересно, что даже в Windows 7 (и, возможно, за ее пределами?) Попытка создать папку с именем `CON` не удастся. Специальные имена файлов были в течение долгого времени. smitelli 6 лет назад 0
@smitelli это просто для обратной совместимости при запуске команд в консоли. Вы можете без проблем создавать файлы / папки с такими именами в Windows. [Создание папки с именем «CON» в Windows] (https://superuser.com/q/129141/241386), phuclv 6 лет назад 0
12
JdeBP

Строго говоря, разработчик приложений для MS / PC / DR-DOS должен запрашивать эту информацию у операционной системы. INT 0x21 с AX = 0x6505 возвращает указатель на так называемую FCHARтаблицу NLS для вашей страны и кодовой страницы. В этой таблице перечислены диапазон символов и дополнительный набор символов, которые заканчиваются именами файлов.

Теоретически это зависит от страны и кодовой страницы. Но тот факт, что он не был формально перенесен в API программы управления OS / 2, и тот факт, что FreeDOS имеет 1 таблицу на всех кодовых страницах и в разных странах, показывают, что она практически неизменна на практике.

дальнейшее чтение

10
My life is a bug.

Я нашел это в руководстве для MS-DOS 3.3. Я бегу 6.22, но, вероятно, все еще применяется. Я был не прав насчет «+».

Enter image description here

Руководство от back-in-the-day более надежно, чем Wikipedia Stewart 6 лет назад 2
@Stewart важны цитаты из Википедии, а не сама Википедия. Если вы сомневаетесь, просто посмотрите сноски и ссылки в статье \ @Mylifeisabug. Я только что добавил руководство по MS-DOS 6. phuclv 6 лет назад 0
3
ErikF

Если вы просто хотите проверить имя файла, вы можете использовать его, INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)убедившись, что переданное имя файла не имеет двоеточия или обратной косой черты (их можно рассматривать как буквы дисков и каталоги): функция берет предложенное имя файла и пытается канонизировать это путем ввода заглавных букв и проверки на недопустимые символы (также добавляются буква диска / имя сервера и путь.)

В псевдокоде:

If !(filename contains {"/", "\", ".", ":"}) Canonicalize filename (INT 21H/AH=60H) If !(CF is set) filename is valid Filename is not valid 

Похожие вопросы