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

16

J'écris une procédure d'E / S de nom de fichier dans le langage d'assemblage x86-16. Il prend 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 lettres majuscules / minuscules, les traits de soulignement et les tirets.

Je voudrais 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 plus est légal. (modifier: 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.

Ma vie est un bug.
la source
17
Vous pouvez également trouver le Retrocomputing utile.
Bob
Essayez de créer un dossier dans Windows et mettez un «?» dans le nom. Une info-bulle vous indique quels caractères sont interdits. Cela vous donne un début
:)
@Mixxiphoid qui ne fonctionnera pas car l'ensemble des caractères autorisés dans Windows est beaucoup plus grand. Par exemple +,;[], l'espace et a-zsont autorisés sous Windows mais pas sous DOS. L'Explorateur me donne l'erreur "Un nom de fichier ne peut contenir aucun des caractères suivants \ / : * ? " < > |qui n'est qu'un sous-ensemble des caractères interdits dans DOS
phuclv
1
@phuclv c'est pourquoi j'ai dit 'ça vous donne un début' et aussi pourquoi c'est un commentaire et non une réponse.
Mixxiphoid
Pourquoi tous les symboles MS-DOS? Pourquoi ne pas également considérer d'autres anciennes règles de système d'exploitation?
jpmc26

Réponses:

30

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

Les caractères autorisés pour les noms de fichiers DOS sont les suivants:

  • Lettres majuscules A-Z
  • Numéros 0-9
  • Espace (bien que les espaces de fin du nom de base ou de l'extension soient considérés comme du remplissage et non comme une partie du nom de fichier, les noms de fichiers contenant des espaces doivent également être placés entre guillemets pour être utilisés sur une ligne de commande DOS, et si le DOS La commande est construite par programme, le nom de fichier doit être placé entre quatre guillemets lorsqu'il est vu comme une variable dans le programme qui crée la commande DOS.)
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Valeurs 128–255 (bien que si les services NLS sont actifs sous DOS, certains caractères interprétés comme des minuscules ne sont pas valides et ne sont pas disponibles)

Cela exclut les caractères ASCII suivants:

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

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

Et voici ce que le guide de l'utilisateur de 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 sur chaque lecteur, doit avoir un nom. La liste suivante résume les règles de dénomination 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 que vous utilisiez des lettres majuscules ou minuscules lorsque vous les saisissez.
  • Peut contenir uniquement les lettres A à Z, les chiffres de 0 à 9 et les caractères spéciaux suivants: trait de soulignement ( _), ^signe d' insertion ( ), signe dollar ( $), tilde ( ~), point d'exclamation ( !), signe numérique ( #), signe pourcentage ( %), esperluette ( &), trait d'union ( -), accolades ( {}), au signe ( @), 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 ou 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 du même répertoire.

Cela vient de PC-DOS 7:

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

  • Il ne peut pas contenir plus de huit caractères.
  • Il peut être composé des lettres 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 ou de points (sauf le point qui sépare le nom de l'extension).
  • Le nom ne peut pas être l'un des noms de fichiers 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 courts ou les extensions sont remplis d'espaces. Caractères ASCII spéciaux 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, le voici .

phuclv
la source
11
Il pourrait être intéressant de noter que , même si elles ne contiennent que des caractères valides les noms de fichiers spéciaux CON, PRN, AUX, NUL, COM1,COM2 , COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8et ne LPT9sont pas autorisées (voir ici )
Thomas Schremser
3
@ThomasSchremser "Ne pas utiliser", "Eviter" et "Non recommandé" n'est pas la même chose que "non autorisé".
RobIII
1
@RobIII Oui mais ils sont liés à la documentation "Windows> Desktop", pas à la documentation "MS-DOS". Le wiki pour DOS dit: "Il y a des noms de périphériques réservés dans DOS qui ne peuvent pas être utilisés comme noms de fichiers quelle que soit l'extension car ils sont occupés par des périphériques de caractères intégrés". En d'autres termes, non autorisé dans DOS et certaines versions de Windows, et non recommandé dans d'autres versions de Windows.
Quantic
Il est intéressant de noter que le `est appelé une seule citation. Je l'ai toujours entendu appeler un backtick, et le '(ce qu'ils appellent (pas incorrectement) une apostrophe) comme une citation simple.
ale10ander
2
@ ale10ander ouais qui m'a surpris. J'ai toujours détesté que beaucoup de gens l'utilisent pour l'apostrophe (comme dans I`m) ou la partie de début de la citation. Par exemple, les documentations GNU écrivent toujours «comme ça», ce qui est très moche et moins lisible pour moi
phuclv
12

À strictement parler, en tant que programmeur d'applications MS / PC / DR-DOS, vous êtes censé demander ces informations au système d'exploitation. INT 0x21 avec AX = 0x6505 renvoie un pointeur vers la FCHARtable dite NLS pour votre pays et votre page de codes. Ce tableau répertorie une plage de caractères et un autre ensemble de caractères qui terminent les noms de fichiers.

En théorie, cela varie selon le pays et la page 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 le fait que FreeDOS possède 1 table sur toutes les pages de codes et les pays montrent qu'il est largement invariant dans la pratique.

Lectures complémentaires

JdeBP
la source
10

J'ai trouvé cela dans un manuel pour MS-DOS 3.3. J'utilise 6.22, mais cela s'applique probablement toujours. J'avais tort que «+» soit autorisé.

Entrez la description de l'image ici

Ma vie est un bug.
la source
2
Un manuel de back-in-the-day est plus fiable que Wikipedia
Stewart
@Stewart ce qui est important, ce sont les citations sur Wikipédia, pas Wikipédia lui-même. En cas de doute, vérifiez les notes de bas de page et les références dans l'article \ @Mylifeisabug Je viens d'ajouter le manuel MS-DOS 6
phuclv
3

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 passé n'a pas de deux-points ou de barre oblique inverse (ceux-ci peuvent être traités comme des lettres de lecteur et des répertoires): la fonction prend le nom de fichier proposé et tente de canoniser en mettant en majuscule les lettres et en vérifiant les caractères non valides (il ajoute également une lettre de lecteur / un nom de 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
ErikF
la source