Quali caratteri non sono validi per un nome file MS-DOS?


16

Sto scrivendo una procedura di I / O per i nomi di file in linguaggio assembly x86-16. Richiede otto caratteri (non ho bisogno di supportare nomi di file lunghi) dalla tastiera e li stampa su un campo di immissione testo su schermo.

Al momento sto permettendo numeri, lettere maiuscole / minuscole, caratteri di sottolineatura e trattini.

Vorrei consentire tutti i simboli legali, ma non riesco a trovare un elenco ufficiale di personaggi vietati. Il buon senso mi dice che le barre sono illegali, ma se dovessi indovinare, direi che il carattere positivo è legale. (modifica: non lo è!)

Sto già ignorando il carattere punto poiché il mio codice gestisce automaticamente l'aggiunta del periodo e l'estensione del file.


17
Potresti anche trovare utile Retrocomputing .
Bob,

Prova a creare una cartella in Windows e inserisci un '?' nel nome. Una descrizione comandi indica quali personaggi sono vietati. Questo ti dà un inizio
:)

@Mixxiphoid che non funzionerà perché il set di caratteri consentiti in Windows è molto più grande. Ad esempio +,;[], spazio e a-zsono consentiti in Windows ma non in DOS. Explorer mi dà l'errore "Un nome file non può contenere nessuno dei seguenti caratteri \ / : * ? " < > |che è solo un sottoinsieme dei caratteri vietati in DOS
phuclv,

1
@phuclv ecco perché ho detto 'Questo ti dà un inizio' e anche perché questo è un commento e non una risposta.
Mixxiphoid,

Perché tutti i simboli MS-DOS? Perché non considerare anche altre regole del sistema operativo precedenti?
jpmc26,

Risposte:


30

Un breve riassunto è disponibile su Wikipedia :

I caratteri legali per i nomi di file DOS includono quanto segue:

  • Lettere maiuscole A-Z
  • Numeri 0-9
  • Spazio (anche se gli spazi finali nel nome di base o nell'estensione sono considerati come riempimento e non parte del nome file, anche i nomi dei file con spazi devono essere racchiusi tra virgolette per essere utilizzati su una riga di comando DOS e se il DOS Il comando viene creato a livello di codice, il nome file deve essere racchiuso tra virgolette quadruple quando viene visualizzato come variabile all'interno del programma che crea il comando DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Valori 128–255 (sebbene se i servizi NLS sono attivi in ​​DOS, alcuni caratteri interpretati come minuscoli non sono validi e non disponibili)

Ciò esclude i seguenti caratteri ASCII:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS non ha caratteri di escape shell
  • .(U + 002E. Punto completo) all'interno dei campi nome e estensione, tranne in. e .. voci (vedi sotto)
  • Lettere minuscole a- z(memorizzate come A-Z su FAT12 / FAT16)
  • Caratteri di controllo 0–31
  • Valore 127 (DEL) [dubbio - discutere]

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

Ed ecco cosa ha detto ufficialmente la guida dell'utente di MS-DOS 6

Denominazione di file e directory

Ogni file e directory, ad eccezione della directory principale su ogni unità, deve avere un nome. L'elenco seguente riepiloga le regole per la denominazione di file e directory. Nomi di file e directory:

  • Può contenere fino a otto caratteri. Inoltre, puoi includere un'estensione lunga fino a tre caratteri.
  • Non fanno distinzione tra maiuscole e minuscole. Non importa se usi lettere maiuscole o minuscole quando le digiti.
  • Può contenere solo le lettere dalla A alla Z, i numeri da 0 a 9 e i seguenti caratteri speciali: carattere di sottolineatura ( _), punto di inserimento ( ^), simbolo del dollaro ( $), tilde ( ~), punto esclamativo ( !), segno di numero ( #), segno di percentuale ( %), e commerciale ( &), trattino ( -), parentesi graffe ( {}), a segno ( @), virgolette singole ( `), apostrofo ( ') e parentesi (). Nessun altro personaggio speciale è accettabile.
  • Non può contenere spazi, virgole, barre rovesciate o punti (tranne il periodo che separa il nome dall'estensione).
  • Non può essere identico al nome di un altro file o sottodirectory nella stessa directory.

Questo è da PC-DOS 7:

Il nome assegnato a un file deve soddisfare i seguenti criteri:

  • Non può contenere più di otto caratteri.
  • Può essere composto dalle lettere dalla A alla Z, dai numeri da 0 a 9 e dai seguenti caratteri speciali:

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

Nota: non sono ammessi altri caratteri speciali.

  • Il nome non può contenere spazi, virgole, barre rovesciate o punti (tranne il periodo che separa il nome dall'estensione).
  • Il nome non può essere uno dei seguenti nomi di file riservati: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL e PRN.
  • Non può avere lo stesso nome di un altro file all'interno della directory.

Guida dell'utente - PC DOS 7

Il primo byte di un nome non deve essere 0x20 (spazio). I nomi brevi o le estensioni sono riempiti di spazi. Caratteri ASCII speciali 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3a ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) non sono consentiti.

Il filesystem FAT

Se anche tu sei interessato a MS-DOS 5.0, eccolo qui .


11
Potrebbe valere la pena di notare che anche se contengono solo caratteri validi i nomi dei file speciali CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, e LPT9sono, inoltre, non consentito (vedi qui )
Thomas Schremser

3
@ThomasSchremser "Non utilizzare", "Evita" e "Non consigliato" non è uguale a "Non consentito".
RobIII,

1
@RobIII Sì, ma si collegavano alla documentazione "Windows> Desktop", non alla documentazione "MS-DOS". Il wiki per DOS dice: "Ci sono nomi di dispositivi riservati in DOS che non possono essere usati come nomi di file indipendentemente dall'estensione poiché sono occupati da dispositivi a caratteri incorporati". In altre parole, non consentito in DOS e in alcune versioni di Windows e non raccomandato in altre versioni di Windows.
Quantic,

È interessante notare che `ʻ è indicato come una singola citazione. Ho sempre sentito che si chiamava backtick e '(quello che chiamano (non erroneamente) un apostrofo) come una singola citazione.
ale10ander,

2
@ ale10ander sì che mi ha sorpreso. Ho sempre odiato che molte persone lo usino per l'apostrofo (come in I`m) o per la parte iniziale della citazione. Ad esempio, le documentazioni GNU scrivono sempre "così" che è molto brutto e meno leggibile per me
phuclv,

12

A rigor di termini, come programmatore di applicazioni MS / PC / DR-DOS dovresti chiedere queste informazioni al sistema operativo. INT 0x21 con AX = 0x6505 restituisce un puntatore alla cosiddetta FCHARtabella NLS per il tuo paese e la tua tabella codici. Questa tabella elenca un intervallo di caratteri e un ulteriore set di caratteri che terminano i nomi dei file.

In teoria varia in base al paese e alla tabella codici. Ma il fatto che non sia stato formalmente trasferito nell'API del programma di controllo OS / 2 e il fatto che FreeDOS abbia 1 tabella in tutte le tabelle di codici e in tutti i paesi dimostra che è sostanzialmente invariante nella pratica.

Ulteriori letture


10

L'ho trovato in un manuale per MS-DOS 3.3. Sto correndo 6.22, ma probabilmente si applica ancora. Ho sbagliato a "+" essere autorizzato.

Inserisci qui la descrizione dell'immagine


2
Un manuale del back-in-the-day è più affidabile di Wikipedia
Stewart,

@Stewart ciò che è importante sono le citazioni su Wikipedia, non Wikipedia stessa. In caso di dubbi, controlla le note a piè di pagina e i riferimenti nell'articolo \ @Mylifeisabug Ho appena aggiunto il manuale MS-DOS 6
phuclv,

3

Se si desidera solo convalidare il nome file, è possibile utilizzare INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)dopo aver verificato che il nome file passato non abbia due punti o una barra rovesciata (che possono essere trattati come lettere e directory di unità): la funzione accetta il nome file proposto e cerca di canonicalizzare inserendo le lettere in maiuscolo e controllando la presenza di caratteri non validi (aggiunge anche una lettera di unità / nome e percorso del server).

In pseudocodice:

If !(filename contains {"/", "\", ".", ":"})
    Canonicalize filename (INT 21H/AH=60H)
    If !(CF is set) filename is valid
Filename is not valid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.