Które znaki są nieprawidłowe w nazwie pliku MS-DOS?


16

Piszę procedurę we / wy nazwy pliku w języku asemblera x86-16. Pobiera osiem znaków (nie muszę obsługiwać długich nazw plików) z klawiatury i drukuje je w polu wprowadzania tekstu na ekranie.

W tej chwili zezwalam na cyfry, wielkie / małe litery, podkreślenia i łączniki.

Chciałbym dopuścić wszystkie legalne symbole, ale nie mogę znaleźć oficjalnej listy zbanowanych postaci. Zdrowy rozsądek mówi mi, że cięcia są nielegalne, ale gdybym musiał zgadywać, powiedziałbym, że znak plus jest legalny. (edytuj: To nie jest!)

Już ignoruję znak kropki, ponieważ mój kod automatycznie obsługuje dodawanie kropki i rozszerzenia pliku.


17
Przydatne może być również ponowne przetwarzanie .
Bob

Spróbuj utworzyć folder w systemie Windows i wpisz „?” w imieniu. Etykietka informuje, które postacie są zabronione. To daje początek
:)

@Mixxiphoid, który nie zadziała, ponieważ zestaw dozwolonych znaków w systemie Windows jest znacznie większy. Na przykład +,;[], spacja i a-zsą dozwolone w Windows, ale nie DOS. Eksplorator wyświetla błąd „Nazwa pliku nie może zawierać żadnego z następujących znaków, \ / : * ? " < > |który jest tylko podzbiorem zabronionych znaków w systemie DOS
phuclv

1
@ phuclv dlatego powiedziałem „To daje początek”, a także dlaczego jest to komentarz, a nie odpowiedź.
Mixxiphoid

Dlaczego wszystkie symbole MS-DOS? Dlaczego nie rozważyć także innych starszych reguł systemu operacyjnego?
jpmc26

Odpowiedzi:


30

Zwięzłe streszczenie można znaleźć na Wikipedii :

Znaki prawne nazw plików DOS obejmują:

  • Wielkie litery A-Z
  • Numery 0-9
  • Spacja (chociaż końcowe spacje w nazwie podstawowej lub rozszerzeniu są uważane za dopełnianie, a nie za część nazwy pliku, również nazwy plików ze spacjami w nich muszą być ujęte w cudzysłowy, aby mogły być użyte w wierszu poleceń DOS, a jeśli DOS polecenie jest zbudowane programowo, nazwa pliku musi być ujęta w poczwórne cudzysłowy, gdy jest postrzegana jako zmienna w programie budującym polecenie DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Wartości 128–255 (chociaż jeśli usługi NLS są aktywne w DOS, niektóre znaki interpretowane jako małe litery są nieprawidłowe i niedostępne)

Wyklucza to następujące znaki ASCII:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS nie ma znaku ucieczki powłoki
  • .(U + 002E. Kropka) w polach nazwy i rozszerzenia, z wyjątkiem w. i .. wpisy (patrz poniżej)
  • Małe litery a- z(przechowywane jako A – Z w FAT12 / FAT16)
  • Znaki kontrolne 0–31
  • Wartość 127 (DEL) [wątpliwy - dyskutuj]

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

Oto, co oficjalnie powiedział przewodnik użytkownika MS-DOS 6

Nazewnictwo plików i katalogów

Każdy plik i katalog, z wyjątkiem katalogu głównego na każdym dysku, musi mieć nazwę. Poniższa lista zawiera podsumowanie reguł nazewnictwa plików i katalogów. Nazwy plików i katalogów:

  • Może mieć do ośmiu znaków. Ponadto możesz dodać rozszerzenie o długości do trzech znaków.
  • Nie rozróżniają wielkości liter. Nie ma znaczenia, czy podczas pisania używasz wielkich czy małych liter.
  • Może zawierać tylko litery od A do Z, cyfry od 0 do 9 oraz następujące znaki specjalne: podkreślenie ( _), ^znak karetki ( ), znak dolara ( $), tylda ( ~), wykrzyknik ( !), znak liczby ( #), znak procentu ( %), ampersand ( &), łącznik ( -), nawiasy klamrowe ( {}), znak ( @), pojedynczy cudzysłów ( `), apostrof ( ') i nawiasy (). Żadne inne znaki specjalne są niedopuszczalne.
  • Nie może zawierać spacji, przecinków, ukośników odwrotnych ani kropek (z wyjątkiem kropki oddzielającej nazwę od rozszerzenia).
  • Nie może być identyczny z nazwą innego pliku lub podkatalogu w tym samym katalogu.

Pochodzi z PC-DOS 7:

Nazwa przypisana do pliku musi spełniać następujące kryteria:

  • Może zawierać nie więcej niż osiem znaków.
  • Może składać się z liter od A do Z, cyfr od 0 do 9 oraz następujących znaków specjalnych:

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

Uwaga: Żadne inne znaki specjalne są niedopuszczalne.

  • Nazwa nie może zawierać spacji, przecinków, ukośników odwrotnych ani kropek (z wyjątkiem kropki oddzielającej nazwę od rozszerzenia).
  • Nazwa nie może być jedną z następujących zastrzeżonych nazw plików: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL i PRN.
  • Nie może być takiej samej nazwy jak inny plik w katalogu.

Podręcznik użytkownika - PC DOS 7

Pierwszy bajt nazwy nie może mieć wartości 0x20 (spacja). Krótkie nazwy lub rozszerzenia są wypełnione spacjami. Specjalne znaki ASCII 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3a ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) są niedozwolone.

System plików FAT

Jeśli interesuje Cię także MS-DOS 5.0, oto on .


11
Może warto zauważyć, że mimo iż zawierają tylko prawidłowe znaki specjalne nazwy plików CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, a LPT9także nie są dozwolone (patrz tutaj )
Thomas Schremser

3
@ThomasSchremser „Nie używaj”, „Unikaj” i „Niezalecane” to nie to samo, co „niedozwolone”.
RobIII

1
@RobIII Tak, ale łączyły się z dokumentacją „Windows> Pulpit”, a nie z dokumentacją „MS-DOS”. Wiki dla DOS mówi: „Nie są zastrzeżone nazwy urządzeń w systemie DOS, które nie mogą być używane jako nazwy plików niezależnie od rozszerzenia, ponieważ są one zajmowane przez wbudowany w urządzeniach znakowych”. Innymi słowy, niedozwolone w DOS i niektórych wersjach systemu Windows i nie zalecane w innych wersjach systemu Windows.
Quantic

Interesujące jest to, że `jest nazywany pojedynczym cytatem. Zawsze słyszałem, że nazywa się to backtick, a „(jak to nazywają (niepoprawnie) apostrofem) jako pojedynczy cytat.
ale10ander

2
@ ale10ander tak, że mnie to zaskoczyło. Zawsze nienawidziłem tego, że wiele osób używa go do apostrofu (jak u mnie) lub do początku cytatu. Na przykład dokumentacje GNU zawsze piszą „tak”, co jest dla mnie bardzo brzydkie i mniej czytelne
phuclv

12

Ściśle mówiąc, jako programista aplikacji MS / PC / DR-DOS powinieneś zapytać system operacyjny o te informacje. INT 0x21 z AX = 0x6505 zwraca wskaźnik do tak zwanej FCHARtabeli NLS dla twojego kraju i strony kodowej. W tej tabeli wymieniono zakres znaków i kolejny zestaw znaków kończących nazwy plików.

Teoretycznie różni się w zależności od kraju i strony kodowej. Ale fakt, że nie został formalnie przeniesiony do interfejsu API programu sterującego OS / 2 oraz fakt, że FreeDOS ma 1 tabelę na wszystkich stronach kodowych i krajach, pokazuje, że jest w dużej mierze niezmienna w praktyce.

Dalsza lektura


10

Znalazłem to w instrukcji dla MS-DOS 3.3. Korzystam z wersji 6.22, ale prawdopodobnie nadal obowiązuje. Myliłem się, że „+” jest dozwolone.

Wpisz opis zdjęcia tutaj


2
Podręcznik z dnia na dzień jest bardziej niezawodny niż Wikipedia
Stewart

@Stewart ważne są cytaty z Wikipedii, a nie sama Wikipedia. W razie wątpliwości po prostu sprawdź przypisy i odniesienia w artykule \ @Mylifeisabug Właśnie dodałem instrukcję MS-DOS 6
phuclv

3

Jeśli chcesz tylko sprawdzić poprawność nazwy pliku, możesz użyć tego INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)po upewnieniu się, że przekazana nazwa pliku nie ma dwukropka ani ukośnika odwrotnego (mogą być traktowane jako litery dysku i katalogi): funkcja przyjmuje proponowaną nazwę pliku i próbuje kanonalizować zaznaczając litery i sprawdzając, czy są nieprawidłowe znaki (dodaje także literę dysku / nazwę serwera i ścieżkę).

W pseudokodzie:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.