Welche Zeichen sind für einen MS-DOS-Dateinamen ungültig?

16

Ich schreibe eine Dateinamen-E / A-Prozedur in der Assemblersprache x86-16. Es dauert acht Zeichen (ich muss keine langen Dateinamen unterstützen) von der Tastatur und druckt sie in ein Texteingabefeld auf dem Bildschirm.

Im Moment erlaube ich Zahlen, Groß- / Kleinbuchstaben, Unterstriche und Bindestriche.

Ich möchte alle legalen Symbole zulassen, kann jedoch keine offizielle Liste der verbotenen Zeichen finden. Der gesunde Menschenverstand sagt mir, dass Schrägstriche illegal sind, aber wenn ich raten müsste, würde ich sagen, dass das Pluszeichen legal ist. (edit: Es ist nicht!)

Ich ignoriere das Punktzeichen bereits, da mein Code das Anhängen des Punkts und der Dateierweiterung automatisch handhabt.

Mein Leben ist ein Käfer.
quelle
17
Möglicherweise ist Retrocomputing auch hilfreich.
Bob
Versuchen Sie, einen Ordner in Windows zu erstellen und ein '?' im Namen. Ein Tooltipp informiert Sie darüber, welche Zeichen verboten sind. Dies gibt Ihnen einen Anfang
:)
@Mixxiphoid, das nicht funktioniert, da die zulässigen Zeichen in Windows viel größer sind. Zum Beispiel +,;[]Leerzeichen und a-zsind in Windows aber nicht in DOS erlaubt. Der Explorer meldet den Fehler "Ein Dateiname darf keines der folgenden Zeichen enthalten. \ / : * ? " < > |
Dies
1
@phuclv aus diesem Grund habe ich gesagt "Dies gibt Ihnen einen Anfang" und auch, warum dies ein Kommentar und keine Antwort ist.
Mixxiphoid
Warum alle MS-DOS-Symbole? Warum nicht auch andere ältere Betriebssystemregeln berücksichtigen?
jpmc26

Antworten:

30

Eine kurze Zusammenfassung finden Sie auf Wikipedia :

Zulässige Zeichen für DOS-Dateinamen sind:

  • Großbuchstaben A-Z
  • Zahlen 0-9
  • Leerzeichen (obwohl nachfolgende Leerzeichen entweder im Basisnamen oder in der Erweiterung als Füllzeichen und nicht als Teil des Dateinamens betrachtet werden, müssen auch Dateinamen mit Leerzeichen in Anführungszeichen eingeschlossen werden, um in einer DOS-Befehlszeile verwendet zu werden, und wenn das DOS Der Befehl wird programmgesteuert erstellt. Der Dateiname muss in vier Anführungszeichen eingeschlossen werden, wenn er als Variable in dem Programm betrachtet wird, das den DOS-Befehl erstellt.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Werte 128–255 (wenn NLS-Dienste in DOS aktiv sind, sind einige Zeichen, die als Kleinbuchstaben interpretiert werden, ungültig und nicht verfügbar)

Dies schließt die folgenden ASCII-Zeichen aus:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS hat kein Shell-Escape-Zeichen
  • .(U + 002E. Punkt) in Namens- und Erweiterungsfeldern, außer in. und .. Einträge (siehe unten)
  • Kleinbuchstaben a- z(von A bis Z in FAT12 / FAT16 gespeichert)
  • Steuerzeichen 0–31
  • Wert 127 (DEL) [zweifelhaft - diskutieren]

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

Und hier ist, was MS-DOS 6 Benutzerhandbuch offiziell gesagt

Dateien und Verzeichnisse benennen

Jede Datei und jedes Verzeichnis mit Ausnahme des Stammverzeichnisses auf jedem Laufwerk muss einen Namen haben. In der folgenden Liste sind die Regeln für die Benennung von Dateien und Verzeichnissen zusammengefasst. Datei- und Verzeichnisnamen:

  • Kann bis zu acht Zeichen lang sein. Darüber hinaus können Sie eine Erweiterung mit bis zu drei Zeichen einfügen.
  • Sind nicht von Großschreibung von Kleinschreibung abhängig. Es spielt keine Rolle, ob Sie bei der Eingabe Groß- oder Kleinbuchstaben verwenden.
  • Darf nur die Buchstaben A bis Z, die Ziffern 0 bis 9 und die folgenden Sonderzeichen enthalten: Unterstrich ( _), Caret ( ^), Dollarzeichen ( $), Tilde ( ~), Ausrufezeichen ( !), Zahlenzeichen ( #), Prozentzeichen ( %), kaufmännisches Und ( &), Bindestrich ( -), geschweifte Klammern ( {}), @Anführungszeichen ( `), Apostroph ( ') und Klammern (). Andere Sonderzeichen sind nicht zulässig.
  • Darf keine Leerzeichen, Kommas, Backslashes oder Punkte enthalten (außer dem Punkt, der den Namen von der Erweiterung trennt).
  • Darf nicht mit dem Namen einer anderen Datei oder eines Unterverzeichnisses im selben Verzeichnis identisch sein.

Dies ist von PC-DOS 7:

Der Name, den Sie einer Datei zuweisen, muss die folgenden Kriterien erfüllen:

  • Es darf nicht mehr als acht Zeichen enthalten.
  • Es kann aus den Buchstaben A bis Z, den Ziffern 0 bis 9 und den folgenden Sonderzeichen bestehen:

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

Hinweis: Andere Sonderzeichen sind nicht zulässig.

  • Der Name darf keine Leerzeichen, Kommas, umgekehrten Schrägstriche oder Punkte enthalten (außer dem Punkt, der den Namen von der Erweiterung trennt).
  • Der Name darf keiner der folgenden reservierten Dateinamen sein: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL und PRN.
  • Es darf nicht derselbe Name sein wie eine andere Datei im Verzeichnis.

Benutzerhandbuch - PC DOS 7

Das erste Byte eines Namens darf nicht 0x20 (Leerzeichen) sein. Kurznamen oder Erweiterungen werden mit Leerzeichen aufgefüllt. Spezielle ASCII-Zeichen 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3a ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) sind nicht erlaubt.

Das FAT-Dateisystem

Wenn Sie sich auch für MS-DOS 5.0 interessieren, dann ist es hier .

phuclv
quelle
11
Es könnte sein , erwähnenswert, dass , obwohl sie nur gültige Zeichen die speziellen Dateinamen enthalten CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, und LPT9sind auch nicht zulässig (siehe hier )
Thomas Schremser
3
@ThomasSchremser "Nicht verwenden", "Vermeiden" und "Nicht empfohlen" sind nicht dasselbe wie "Nicht zulässig".
RobIII
1
@RobIII Ja, aber sie sind mit der Dokumentation "Windows> Desktop" verknüpft, nicht mit der Dokumentation "MS-DOS". Im Wiki für DOS heißt es: "In DOS gibt es reservierte Gerätenamen, die unabhängig von der Erweiterung nicht als Dateinamen verwendet werden können, da sie von eingebauten Zeichengeräten belegt werden." Mit anderen Worten, in DOS und einigen Windows-Versionen nicht zulässig und in anderen Windows-Versionen nicht empfohlen.
Quantic
Es ist interessant, dass das `als einfaches Anführungszeichen bezeichnet wird. Ich habe immer gehört, dass es ein Backtick und das '(was sie (nicht fälschlicherweise) einen Apostroph nennen) als einfaches Anführungszeichen bezeichnet.
Ale10ander
2
@ Ale10ander Ja, das hat mich überrascht. Ich habe es immer gehasst, dass viele Leute es für den Apostroph (wie in Ich bin) oder den Anfangsteil des Zitats verwenden. Zum Beispiel schreiben GNU-Dokumentationen immer so, was für mich sehr hässlich und weniger lesbar ist
phuclv
12

Genau genommen sollten Sie als MS / PC / DR-DOS-Anwendungsprogrammierer das Betriebssystem nach diesen Informationen fragen. INT 0x21 mit AX = 0x6505 gibt einen Zeiger auf die sogenannte FCHARNLS-Tabelle für Ihr Land und Ihre Codepage zurück. In dieser Tabelle sind eine Reihe von Zeichen und eine weitere Reihe von Zeichen aufgeführt, mit denen Dateinamen abgeschlossen werden.

Theoretisch variiert es je nach Land und Codepage. Die Tatsache, dass es nicht formell in die OS / 2-Steuerprogramm-API übernommen wurde und die Tatsache, dass FreeDOS über alle Codepages und Länder hinweg eine Tabelle enthält, zeigt, dass es in der Praxis weitgehend unveränderlich ist.

Weitere Lektüre

JdeBP
quelle
10

Ich habe dies in einem Handbuch für MS-DOS 3.3 gefunden. Ich lasse 6.22 laufen, aber es trifft wahrscheinlich immer noch zu. Ich habe mich geirrt, dass '+' erlaubt ist.

Geben Sie hier eine Bildbeschreibung ein

Mein Leben ist ein Käfer.
quelle
2
Ein Handbuch von damals ist zuverlässiger als Wikipedia
Stewart
@Stewart Wichtig sind die Zitate auf Wikipedia, nicht auf Wikipedia. Im Zweifelsfall nur die Fußnoten überprüfen und Verweise in dem Artikel \ @Mylifeisabug Ich habe gerade die MS-DOS 6 manuell hinzugefügt
phuclv
3

Wenn Sie nur den Dateinamen validieren möchten, können Sie ihn verwenden, INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)nachdem Sie sichergestellt haben, dass der übergebene Dateiname keinen Doppelpunkt oder Backslash enthält (diese werden möglicherweise als Laufwerksbuchstaben und Verzeichnisse behandelt): Die Funktion verwendet den vorgeschlagenen Dateinamen und versucht, die Kanonisierung durchzuführen es durch Großschreibung der Buchstaben und Überprüfung auf ungültige Zeichen (es fügt auch einen Laufwerksbuchstaben / Servernamen und Pfad hinzu.)

Im Pseudocode:

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