Які символи недійсні для імені файлу MS-DOS?


16

Я пишу процедуру вводу / виводу імені файлу мовою збірки x86-16. З клавіатури потрібно вісім символів (мені не потрібно підтримувати довгі імена файлів) і друкує їх у екранне поле для введення тексту.

На даний момент я дозволяю цифри, великі та малі літери, підкреслення та дефіси.

Я хотів би дозволити всі легальні символи, але я не можу знайти офіційний список заборонених символів. Здоровий глузд підказує мені, що косої риси є незаконними, але якби мені довелося здогадуватися, я б сказав, що плюс плюс є законним. (редагувати: Це не так!)

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


17
Ретрокомп'ютинг також може бути корисним.
Боб

Спробуйте створити папку в Windows і поставити "?" в імені. Підказка повідомляє, які символи заборонені. Це дає вам початок:) ...
Mixxiphoid

@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 (хоча якщо сервіси NLS активні в DOS, деякі символи, інтерпретовані як малі регістри, є недійсними та недоступними)

Це виключає такі символи ASCII:

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

https://en.wikipedia.org/wiki/8.3_файл#Directory_table

І ось що офіційно сказав посібник користувача MS-DOS 6

Ім'я файлів і каталогів

Кожен файл і каталог, крім кореневого каталогу на кожному диску, повинні мати ім’я. У наступному списку підсумовані правила іменування файлів та каталогів. Імена файлів та каталогів:

  • Може містити до восьми символів. Крім того, ви можете включити розширення довжиною до трьох символів.
  • Не відрізняються від регістру. Не має значення, чи використовуєте ви великі або малі літери, коли ви їх вводите.
  • Може містити лише літери від А до Я, цифри від 0 до 9 та такі спеціальні символи: підкреслення ( _), карет ( ^), знак долара ( $), тильда ( ~), знак оклику ( !), числовий знак ( #), знак відсотка ( %), амперсанд ( &), дефіс ( -), дужки ( {}), знак ( @), одна лапка ( `), апостроф ( ') і дужки (). Жодні інші спеціальні символи не прийнятні.
  • Не може містити пробілів, коми, косої риски чи періоди (крім періоду, який відокремлює назву від розширення).
  • Не може бути тотожним імені іншого файлу чи підкаталогу в тому самому каталозі.

Це з PC-DOS 7:

Ім'я, яке ви присвоюєте файлу, повинно відповідати наступним критеріям:

  • Він може містити не більше восьми символів.
  • Він може складатися з літер від А до Я, цифр від 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

Цікаво, що `згадується як єдина цитата. Я завжди чув, що це називається "backtick", а "(те, що вони називають (не помилково) апострофом)", як єдина цитата.
ale10ander

2
@ ale10ander Так, це мене здивувало. Я завжди ненавидів, що багато людей використовують це для апострофа (як у I`m) або початкової частини цитати. Наприклад, документації GNU завжди пишуть "як це", що дуже некрасиво і менш читабельно для мене
phuclv

12

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

Теоретично він залежить від країни та кодової сторінки. Але той факт, що він офіційно не переносився в API програми керування OS / 2, і той факт, що FreeDOS має одну таблицю для всіх кодових сторінок і країн, свідчить про те, що вона практично інваріантна на практиці.

Подальше читання


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.