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

3247
My life is a bug.

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

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

Ich würde gerne alle rechtlichen Symbole zulassen, aber ich kann keine offizielle Liste verbotener Charaktere 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: Das ist es nicht!)

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

16
Möglicherweise ist auch [retrocomputing.se] hilfreich. Bob vor 5 Jahren 17
Versuchen Sie, einen Ordner in Windows zu erstellen und setzen Sie ein "?" im Namen. Ein Tooltip zeigt an, welche Zeichen verboten sind. Das gibt Ihnen einen Anfang:) ... Mixxiphoid vor 5 Jahren 0
@Mixxiphoid funktioniert nicht, da die Anzahl der zulässigen Zeichen in Windows viel größer ist. In Windows sind zum Beispiel `+ ,; []`, Leerzeichen und `az` erlaubt, nicht jedoch DOS. Der Explorer gibt mir den Fehler "Ein Dateiname darf keines der folgenden Zeichen enthalten: \ /: *?" <> | `Dies ist nur eine Teilmenge der unter DOS gesperrten Zeichen phuclv vor 5 Jahren 0
@phuclv deswegen habe ich gesagt 'das gibt dir einen Start' und auch, warum dies ein Kommentar und keine Antwort ist. Mixxiphoid vor 5 Jahren 1
Warum alle MS-DOS-Symbole? Warum nicht auch andere ältere Betriebssystemregeln beachten? jpmc26 vor 5 Jahren 0

4 Antworten auf die Frage

29
phuclv

Eine kurze Zusammenfassung kann in Wikipedia gefunden werden :

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

  • Großbuchstaben A-Z
  • Zahlen 0-9
  • Leerzeichen (obwohl nachgestellte Leerzeichen entweder im Basisnamen oder in der Erweiterung als Auffüllung und nicht als Teil des Dateinamens betrachtet werden, müssen auch Dateinamen mit Leerzeichen in Anführungszeichen gesetzt werden, damit sie in einer DOS-Befehlszeile verwendet werden können, und wenn das DOS ist Der Befehl wird programmgesteuert erstellt. Der Dateiname muss in Anführungszeichen gesetzt werden, wenn er als Variable innerhalb des Programms betrachtet wird, das den DOS-Befehl erstellt.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Werte 128–255 (obwohl 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) innerhalb von Namens- und Erweiterungsfeldern, außer in. und .. Einträge (siehe unten)
  • Kleinbuchstaben a- z(als A – Z auf 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 hat

Benennen von Dateien und Verzeichnissen

Jede Datei und jedes Verzeichnis mit Ausnahme des Stammverzeichnisses auf jedem Laufwerk muss einen Namen haben. Die folgende Liste fasst die Regeln für die Benennung von Dateien und Verzeichnissen zusammen. Datei- und Verzeichnisnamen:

  • Kann bis zu acht Zeichen lang sein. Außerdem können Sie eine Erweiterung mit bis zu drei Zeichen hinzufügen.
  • Sind nicht case sensitive 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 ( {}), at-Zeichen ( @), einfache Anführungszeichen ( `), Apostroph ( ') und Klammern (). Andere Sonderzeichen sind nicht zulässig.
  • Kann keine Leerzeichen, Kommas, Backslashes oder Punkte enthalten (außer dem Punkt, der den Namen von der Erweiterung trennt).
  • Kann nicht identisch sein mit dem Namen einer anderen Datei oder eines Unterverzeichnisses im selben Verzeichnis.

Das 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, Backslashes oder Punkte enthalten (außer dem Punkt, der den Namen von der Erweiterung trennt).
  • Der Name darf nicht einer der folgenden reservierten Dateinamen sein: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL und PRN.
  • Es darf nicht derselbe Name wie eine andere Datei im Verzeichnis sein.

Benutzerhandbuch - PC DOS 7

Das erste Byte eines Namens darf nicht 0x20 (Leerzeichen) sein. Kurze Namen 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 zulässig.

Das FAT-Dateisystem

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

Beachten Sie, dass die speziellen Dateinamen "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5" auch nur gültige Zeichen enthalten `,` COM6`, `COM7`,` COM8`, `COM9`,` LPT1`, `LPT2`,` LPT3`, `LPT4`,` LPT5`, `LPT6`,` LPT7`, `LPT8` und `LPT9` sind ebenfalls nicht zulässig (siehe [hier] (https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file)) Thomas Schremser vor 5 Jahren 11
@ThomasSchremser "Nicht verwenden", "Vermeiden" und "Nicht empfohlen" ist nicht dasselbe wie "Nicht zulässig". RobIII vor 5 Jahren 3
@RobIII Ja, aber sie sind mit der Dokumentation "Windows> Desktop" verknüpft, nicht mit der Dokumentation "MS-DOS". Das [Wiki für DOS] (https://en.wikipedia.org/wiki/DOS#Reserved_device_names) sagt: "Es gibt reservierte Gerätenamen in DOS, die unabhängig von der Erweiterung nicht als Dateinamen verwendet werden können, da sie von eingebauten belegt sind Zeichengeräte ". Das heißt, in DOS und einigen Windows-Versionen nicht zulässig und in anderen Windows-Versionen nicht zu empfehlen. Quantic vor 5 Jahren 1
Es ist interessant, dass das `als einzelnes Zitat bezeichnet wird. Ich habe immer gehört, dass es ein Backtick genannt wurde, und das '(was sie (nicht fälschlicherweise) einen Apostroph nennen) als ein einzelnes Zitat. ale10ander vor 5 Jahren 0
@ ale10ander yeah das hat mich überrascht. Ich habe es immer gehasst, dass viele Leute es für den Apostroph (wie in Ich) oder für den Anfangsteil des Zitats verwenden. Zum Beispiel schreiben GNU-Dokumentationen immer "so", was für mich sehr hässlich und weniger lesbar ist phuclv vor 5 Jahren 2
Interessanterweise schlägt selbst in Windows 7 (und möglicherweise darüber hinaus?) Der Versuch fehl, einen Ordner mit dem Namen "CON" zu erstellen. Die speziellen Dateinamen sind eine lange Zeit. smitelli vor 5 Jahren 0
@smitelli ist nur für die Abwärtskompatibilität geeignet, wenn Befehle in der Konsole ausgeführt werden. Sie können Dateien / Ordner mit diesen Namen problemlos unter Windows erstellen. [Erstellen eines Ordners mit dem Namen "CON" in Windows] (https://superuser.com/q/129141/241386), phuclv vor 5 Jahren 0
12
JdeBP

Streng genommen müssen 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. Diese Tabelle enthält eine Reihe von Zeichen und weitere Zeichen, die Dateinamen beenden.

Theoretisch variiert es je nach Land und Codeseite. Aber die Tatsache, dass es nicht formell in die OS / 2-Steuerungsprogramm-API übernommen wurde, und die Tatsache, dass FreeDOS über alle Codepages und Länder hinweg eine Tabelle hat, zeigt, dass es in der Praxis weitgehend invariant ist.

Lesen Sie weiter

10
My life is a bug.

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

Ein Handbuch aus dem Hintergrund ist zuverlässiger als Wikipedia Stewart vor 5 Jahren 2
@Wichtig, was wichtig ist, sind die Zitate in Wikipedia, nicht Wikipedia. Im Zweifelsfall einfach die Fußnoten und Verweise im Artikel \ @Mylifeisabug überprüfen. Ich habe gerade das MS-DOS 6-Handbuch hinzugefügt phuclv vor 5 Jahren 0
3
ErikF

Wenn Sie nur den Dateinamen überprüfen möchten, sollten 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 übernimmt den vorgeschlagenen Dateinamen und versucht, zu kanonisieren Dazu werden die Buchstaben groß geschrieben und auf ungültige Zeichen geprüft (es werden auch ein Laufwerksbuchstabe / Servername und ein Pfad hinzugefügt.)

Im Pseudocode:

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