¿Qué caracteres no son válidos para un nombre de archivo de MS-DOS?

16

Estoy escribiendo un procedimiento de E / S de nombre de archivo en lenguaje ensamblador x86-16. Toma ocho caracteres (no necesito admitir nombres de archivo largos) del teclado y los imprime en un campo de entrada de texto en pantalla.

Por el momento, estoy permitiendo números, letras mayúsculas / minúsculas, guiones bajos y guiones.

Me gustaría permitir todos los símbolos legales, pero no puedo encontrar una lista oficial de caracteres prohibidos. El sentido común me dice que las barras son ilegales, pero si tuviera que adivinar, diría que el carácter positivo es legal. (editar: ¡no lo es!)

Ya estoy ignorando el carácter del punto ya que mi código maneja automáticamente la adición del período y la extensión del archivo.

Mi vida es un error.
fuente
17
También puede encontrar útil la retrocomputación .
Bob
Intenta crear una carpeta en Windows y pon un '?' en el nombre. Una información sobre herramientas le indica qué caracteres están prohibidos. Esto le da un comienzo
:)
@Mixxiphoid que no funcionará porque el conjunto de caracteres permitidos en Windows es mucho más grande. Por ejemplo +,;[], espacio y a-zestán permitidos en Windows pero no en DOS. Explorer me da el error "Un nombre de archivo no puede contener ninguno de los siguientes caracteres, \ / : * ? " < > |que es solo un subconjunto de los caracteres prohibidos en DOS
phuclv
1
@phuclv es por eso que dije 'Esto te da un comienzo' y también por qué esto es un comentario y no una respuesta.
Mixxiphoid
¿Por qué todos los símbolos de MS-DOS? ¿Por qué no considerar también otras reglas anteriores del sistema operativo?
jpmc26

Respuestas:

30

Un resumen conciso se puede encontrar en Wikipedia :

Los caracteres legales para los nombres de archivo de DOS incluyen lo siguiente:

  • Las letras mayúsculas A-Z
  • números 0-9
  • Espacio (aunque los espacios finales en el nombre base o en la extensión se consideran como relleno y no como parte del nombre de archivo, también los nombres de archivo con espacios deben estar entre comillas para usarlos en una línea de comando de DOS, y si el DOS El comando se crea mediante programación, el nombre del archivo debe estar entre comillas cuádruples cuando se ve como una variable dentro del programa que construye el comando DOS).
  • ! # $ % & ' ( ) - @ ^ _ ` { } ~
  • Valores 128–255 (aunque si los servicios NLS están activos en DOS, algunos caracteres interpretados como minúsculas no son válidos y no están disponibles)

Esto excluye los siguientes caracteres ASCII:

  • " * + , / : ; < = > ? \ [ ] | [9]
  • Windows / MS-DOS no tiene carácter de escape de shell
  • .(U + 002E. Punto final) dentro de los campos de nombre y extensión, excepto en. y .. entradas (ver abajo)
  • Letras minúsculas a- z(almacenadas como A – Z en FAT12 / FAT16)
  • Caracteres de control 0–31
  • Valor 127 (DEL) [dudoso - discutir]

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

Y esto es lo que dijo oficialmente la guía del usuario de MS-DOS 6

Nombrar archivos y directorios

Todos los archivos y directorios, excepto el directorio raíz de cada unidad, deben tener un nombre. La siguiente lista resume las reglas para nombrar archivos y directorios. Nombres de archivo y directorio:

  • Puede tener hasta ocho caracteres de longitud. Además, puede incluir una extensión de hasta tres caracteres de longitud.
  • No distinguen entre mayúsculas y minúsculas. No importa si usa letras mayúsculas o minúsculas cuando las escribe.
  • Puede contener solo las letras de la A a la Z, los números del 0 al 9 y los siguientes caracteres especiales: guión bajo ( _), intercalado ( ^), signo de dólar ( $), tilde ( ~), signo de exclamación ( !), signo de número ( #), signo de porcentaje ( %), ampersand ( &), guión ( -), llaves ( {}), en el signo ( @), comillas simples ( `), apóstrofo ( ') y paréntesis (). No se aceptan otros caracteres especiales.
  • No puede contener espacios, comas, barras invertidas o puntos (excepto el punto que separa el nombre de la extensión).
  • No puede ser idéntico al nombre de otro archivo o subdirectorio en el mismo directorio.

Esto es de PC-DOS 7:

El nombre que asigne a un archivo debe cumplir con los siguientes criterios:

  • No puede contener más de ocho caracteres.
  • Puede consistir en las letras de la A a la Z, los números del 0 al 9 y los siguientes caracteres especiales:

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

Nota: No se aceptan otros caracteres especiales.

  • El nombre no puede contener espacios, comas, barras diagonales o puntos (excepto el punto que separa el nombre de la extensión).
  • El nombre no puede ser uno de los siguientes nombres de archivo reservados: CLOCK $, CON, AUX, COM1, COM2, COM3, COM4, ​​LPT1, LPT2, LPT3, LPT4, NUL y PRN.
  • No puede ser el mismo nombre que otro archivo dentro del directorio.

Guía del usuario - PC DOS 7

El primer byte de un nombre no debe ser 0x20 (espacio). Los nombres cortos o las extensiones se rellenan con espacios. Caracteres especiales ASCII 0x22 ( "), 0x2a ( *), 0x2b ( +), 0x2c ( ,), 0x2e ( .), 0x2f ( /), 0x3a ( :), 0x3b ( ;), 0x3c ( <), 0x3d ( =), 0x3e ( >), 0x3f ( ?) , 0x5b ( [), 0x5c ( \), 0x5d ( ]), 0x7c ( |) no están permitidos.

El sistema de archivos FAT

Si también está interesado en MS-DOS 5.0, aquí está .

phuclv
fuente
11
Podría valer la pena señalar que a pesar de que sólo contienen caracteres válidos los nombres de archivos especiales CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, y LPT9tampoco están permitidos (ver aquí )
Thomas Schremser
3
@ThomasSchremser "No usar", "Evitar" y "No recomendado" no es lo mismo que "no permitido".
RobIII
1
@RobIII Sí, pero se vincularon a la documentación de "Windows> Escritorio", no a la documentación de "MS-DOS". El wiki para DOS dice: "Hay nombres de dispositivos reservados en DOS que no se pueden usar como nombres de archivos, independientemente de la extensión, ya que están ocupados por dispositivos de caracteres integrados". En otras palabras, no está permitido en DOS y algunas versiones de Windows, y no se recomienda en otras versiones de Windows.
Quantic
Es interesante que el `se mencione como una cita simple. Siempre he escuchado que se llama un backtick, y el '(lo que llaman (no incorrectamente) un apóstrofe) como una cita simple.
ale10ander
2
@ ale10ander sí, eso me sorprendió. Siempre he odiado que muchas personas lo usen para el apóstrofe (como en I`m) o la parte inicial de la cita. Por ejemplo, las documentaciones de GNU siempre escriben `` así '', lo cual es muy feo y menos legible para mí
phuclv
12

Hablando estrictamente, como programador de aplicaciones MS / PC / DR-DOS se supone que debe solicitar esta información al sistema operativo. INT 0x21 con AX = 0x6505 devuelve un puntero a la llamada FCHARtabla NLS para su país y página de códigos. Esta tabla enumera un rango de caracteres y un conjunto adicional de caracteres que terminan los nombres de archivo.

En teoría, varía según el país y la página de códigos. Pero el hecho de que no se transfirió formalmente a la API del programa de control de OS / 2 y el hecho de que FreeDOS tiene 1 tabla en todas las páginas de códigos y países muestran que en gran medida es invariable en la práctica.

Otras lecturas

JdeBP
fuente
10

Encontré esto en un manual para MS-DOS 3.3. Estoy ejecutando 6.22, pero probablemente todavía se aplica. Me equivoqué acerca de que se permitiera '+'.

Ingrese la descripción de la imagen aquí

Mi vida es un error.
fuente
2
Un manual de antaño es más confiable que Wikipedia
Stewart,
@Stewart lo importante son las citas en Wikipedia, no Wikipedia en sí. En caso de duda, consulte las notas al pie y las referencias en el artículo \ @Mylifeisabug. Acabo de agregar el manual de MS-DOS 6
phuclv
3

Si solo desea validar el nombre del archivo, puede usarlo INT 21H/AH=60H (TRUENAME - CANONICALIZE FILENAME OR PATH)después de asegurarse de que el nombre del archivo pasado no tenga dos puntos o barra invertida (pueden tratarse como letras de unidad y directorios): la función toma su nombre de archivo propuesto e intenta canonicalizar en mayúsculas y buscando caracteres no válidos (también agrega una letra de unidad / nombre de servidor y ruta).

En pseudocódigo:

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