web-dev-qa-db-fra.com

Quels caractères ne sont pas valides pour un nom de fichier MS-DOS?

J'écris une procédure d'E/S de nom de fichier en langage assembleur x86-16. Il faut huit caractères (je n'ai pas besoin de prendre en charge les noms de fichiers longs) du clavier et les imprime dans un champ de saisie de texte à l'écran.

Pour le moment, j'autorise les chiffres, les majuscules et les minuscules, les traits de soulignement et les traits d'union.

J'aimerais autoriser tous les symboles légaux, mais je ne trouve pas de liste officielle des personnages interdits. Le bon sens me dit que les barres obliques sont illégales, mais si je devais deviner, je dirais que le caractère positif est légal. (edit: Ce n'est pas!)

J'ignore déjà le caractère de période car mon code gère automatiquement l'ajout de la période et de l'extension de fichier.

16
My life is a bug.

Un résumé concis peut être trouvé sur Wikipedia :

Les caractères légaux pour les noms de fichiers DOS sont les suivants:

  • Lettres majuscules AZ
  • Chiffres 09
  • Espace (bien que les espaces de fin dans le nom de base ou dans l’extension soient considérés comme un remplissage et non comme une partie du nom de fichier, les noms de fichiers contenant des espaces doivent être placés entre guillemets pour pouvoir être utilisés sur une ligne de commande DOS. Cette commande est générée par programme, le nom du fichier doit être placé entre guillemets lorsqu'il est considéré comme une variable dans le programme créant la commande DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Valeurs 128–255 (cependant, si les services NLS sont actifs sous DOS, certains caractères interprétés en minuscules ne sont pas valides et ne sont pas disponibles)

Ceci exclut les caractères ASCII suivants:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows/MS-DOS n'a pas de caractère d'échappement Shell
  • . (U + 002E. point final) dans les champs nom et extension, sauf dans. et .. entrées (voir ci-dessous)
  • Lettres minuscules az (stockées sous A – Z sur FAT12/FAT16)
  • Caractères de contrôle 0–31
  • Valeur 127 (DEL) [douteux - discuter]

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

Et voici ce que le guide de l'utilisateur MS-DOS 6 a officiellement déclaré

Nommer des fichiers et des répertoires

Chaque fichier et répertoire, à l'exception du répertoire racine de chaque lecteur, doit avoir un nom. La liste suivante récapitule les règles pour nommer des fichiers et des répertoires. Noms de fichiers et de répertoires:

  • Peut contenir jusqu'à huit caractères. De plus, vous pouvez inclure une extension de trois caractères maximum.
  • Ne sont pas sensibles à la casse. Peu importe si vous utilisez des lettres majuscules ou minuscules lorsque vous les tapez.
  • Peut contenir uniquement les lettres de A à Z, les chiffres de 0 à 9 et les caractères spéciaux suivants: trait de soulignement (_), caret (^), signe dollar ($), tilde (~), point d'exclamation (!), signe numérique (#), signe de pourcentage (%), perluète (&), trait d'union (-), accolades ({}), arobase (@), guillemet simple (`), apostrophe (') et parenthèses (). Aucun autre caractère spécial n'est acceptable.
  • Ne peut pas contenir d'espaces, de virgules, de barres obliques inverses ni de points (sauf le point qui sépare le nom de l'extension).
  • Ne peut pas être identique au nom d'un autre fichier ou sous-répertoire dans le même répertoire.

C'est à partir de PC-DOS 7:

Le nom que vous attribuez à un fichier doit répondre aux critères suivants:

  • Il ne peut contenir plus de huit caractères.
  • Il peut être constitué des lettres de A à Z, des chiffres de 0 à 9 et des caractères spéciaux suivants:

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

Remarque: aucun autre caractère spécial n'est acceptable.

  • Le nom ne peut pas contenir d'espaces, de virgules, de barres obliques inverses ni de points (à l'exception du point qui sépare le nom de l'extension).
  • Le nom ne peut pas être l'un des noms de fichier réservés suivants: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL et PRN.
  • Il ne peut pas s'agir du même nom qu'un autre fichier du répertoire.

Guide de l'utilisateur - PC DOS 7

Le premier octet d'un nom ne doit pas être 0x20 (espace). Les noms abrégés ou les extensions sont remplis d'espaces. Spéciaux ASCII caractères 0x22 ("), 0x2a (*), 0x2b (+), 0x2c (,), 0x2e (.), 0x2f (/), 0x3a (:), 0x3b (;), 0x3c (<), 0x3d (=), 0x3e (>), 0x3f (?), 0x5b ([), 0x5c (\), 0x5d (]), 0x7c (|) ne sont pas autorisés.

Le système de fichiers FAT

Si vous êtes également intéressé par MS-DOS 5.0, alors le voilà .

30
phuclv

Strictement parlant, en tant que programmeur d'applications MS/PC/DR-DOS, vous êtes censé demander cette information au système d'exploitation. INT 0x21 avec AXE = 0x6505 renvoie un pointeur sur la table NLS FCHAR pour votre pays et votre page de code. Ce tableau répertorie une plage de caractères et un autre groupe de caractères qui terminent les noms de fichiers.

En théorie, cela varie selon les pays et les pages de codes. Mais le fait qu’il n’ait pas été officiellement transféré dans l’API du programme de contrôle OS/2 et que FreeDOS comporte un tableau sur l’ensemble des pages de codes et des pays montrent qu’il est en grande partie invariant.

Lectures complémentaires

12
JdeBP

J'ai trouvé cela dans un manuel pour MS-DOS 3.3. J'utilise la version 6.22, mais cela s'applique probablement toujours. Je me suis trompé sur le «+» étant autorisé.

 Enter image description here

10
My life is a bug.

Si vous souhaitez simplement valider le nom de fichier, vous pouvez utiliser INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH) après vous être assuré que le nom de fichier transmis ne comporte pas de signe deux-points ni de barre oblique inverse (celles-ci peuvent être traitées comme des lettres de lecteur et des répertoires): la fonction prend votre proposition. nomdefichier et tente de le canoniser en mettant en majuscule les lettres et en vérifiant la présence de caractères non valides (il ajoute également une lettre de lecteur/nom du serveur et un chemin d'accès.)

En pseudocode:

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