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


16

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

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

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

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


17
Вы также можете найти полезными Retrocomputing .
Боб

Попробуйте создать папку в Windows и поставить '?' во имя. Подсказка говорит вам, какие символы запрещены. Это дает вам начало
:)

@Mixxiphoid, который не будет работать, потому что набор разрешенных символов в Windows намного больше. Например +,;[], пробел и a-zразрешены в Windows, но не в DOS. Проводник выдает мне ошибку: «Имя файла не может содержать ни одного из следующих символов, \ / : * ? " < > |которые являются лишь подмножеством запрещенных символов в DOS
phuclv

1
@phuclv, поэтому я сказал: «Это дает вам начало», а также почему это комментарий, а не ответ.
Mixxiphoid

Почему все символы MS-DOS? Почему бы также не рассмотреть другие старые правила ОС?
jpmc26

Ответы:


30

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

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

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


11
Может быть , стоит отметить , что несмотря на то, что они содержат только допустимые символы специальные имена файлов CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, и LPT9также не допускается (см здесь )
Томас Schremser

3
@ThomasSchremser «Не использовать», «Избегать» и «Не рекомендуется» не то же самое, что «не разрешено».
RobIII

1
@RobIII Да, но они связаны с документацией «Windows> Desktop», а не с документацией «MS-DOS». Вики для DOS говорят: «Есть зарезервированные имена устройств в DOS , которые не могут быть использованы в качестве имен файлов независимо от расширения , поскольку они занимают встроенные символьные устройства». Другими словами, не допускается в DOS и некоторых версиях Windows и не рекомендуется в других версиях Windows.
Quantic

Интересно, что `упоминается как одиночная кавычка. Я всегда слышал, что это называется обратным ударом, а '(то, что они называют (не неправильно) апострофом) как одиночная цитата.
ale10ander

2
@ ale10ander да, это меня удивило. Я всегда ненавидел то, что многие люди используют его для апострофа (как в «Я») или для начала цитаты. Например, в документации GNU всегда пишется «вот так», что очень уродливо и менее читабельно для меня
phuclv

12

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

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

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


10

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

Введите описание изображения здесь


2
Пособие из «Назад в день» более надежно, чем Википедия
Стюарт,

@Stewart важны цитаты из Википедии, а не сама Википедия. Если сомневаетесь, просто посмотрите сноски и ссылки в статье \ @Mylifeisabug. Я только что добавил руководство по MS-DOS 6
phuclv

3

Если вы просто хотите проверить имя файла, вы можете использовать его, 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.