16

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

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

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

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

4 ответа4

29

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

Допустимые символы для имен файлов 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 и следующие специальные символы: подчеркивание (_), знак каретки (^), знак доллара ($), тильда (~), восклицательный знак (!), Знак числа (#), знак процента (%), амперсанд (&), дефис (-), фигурные скобки ({}), знак (@), одиночная кавычка (`), апостроф (') и скобки () . Другие специальные символы не допускаются.
  • Не может содержать пробелы, запятые, обратную косую черту или точки (кроме периода, отделяющего имя от расширения).
  • Не может быть идентичным имени другого файла или подкаталога в том же каталоге.

Это из 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, то вот она.

12

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

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

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

10

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .