¿Qué caracteres están prohibidos en los nombres de directorio de Windows y Linux?

Resuelto Jeff asked hace 14 años • 20 respuestas

Sé que eso /es ilegal en Linux y * " / \ < > : | ?es ilegal en Windows.

¿Qué más me falta? Necesito una guía completa que también tenga en cuenta los caracteres de doble byte.

Jeff avatar Dec 30 '09 01:12 Jeff
Aceptado
  1. Los caracteres ASCII imprimibles prohibidos son:

    • Linux/Unix:

      / (forward slash)
      
    • Ventanas:

      < (less than)
      > (greater than)
      : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
      " (double quote)
      / (forward slash)
      \ (backslash)
      | (vertical bar or pipe)
      ? (question mark)
      * (asterisk)
      
  2. Caracteres no imprimibles

    Si sus datos provienen de una fuente que permitiría caracteres no imprimibles, entonces hay más que verificar.

    • Linux/Unix:

      0 (NULL byte)
      
    • Ventanas:

      0-31 (ASCII control characters)
      

    Nota: Si bien es legal en los sistemas de archivos Linux/Unix crear archivos con caracteres de control en el nombre del archivo, puede ser una pesadilla para los usuarios lidiar con dichos archivos .

  3. Nombres de archivos reservados

    Los siguientes nombres de archivos están reservados:

    • Ventanas:

      CON, PRN, AUX, NUL 
      COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
      LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      

      (tanto solos como con extensiones de archivo arbitrarias, por ejemplo LPT1.txt).

  4. Otras reglas

    • Ventanas:

      Los nombres de archivos no pueden terminar en un espacio o punto.

    • Mac OS:

      No lo solicitó, pero por si acaso: los dos puntos :y la barra diagonal /según el contexto no están permitidos (por ejemplo, el Finder admite barras diagonales, el terminal admite dos puntos). (Más detalles)

Christopher Oezbek avatar Aug 12 '2015 21:08 Christopher Oezbek

Una “guía completa” de caracteres prohibidos en nombres de archivos no funcionará en Windows porque reserva nombres de archivos además de caracteres. Sí, caracteres como * " ?y otros están prohibidos, pero hay una infinidad de nombres compuestos únicamente por caracteres válidos que están prohibidos. Por ejemplo, los espacios y los puntos son caracteres válidos para los nombres de archivos, pero los nombres compuestos únicamente por esos caracteres están prohibidos.

Windows no distingue entre caracteres en mayúsculas y minúsculas, por lo que no puede crear una carpeta con nombre Asi ya existe una a. Peor aún, nombres aparentemente permitidos como PRNy CONy muchos otros están reservados y no permitidos. Windows también tiene varias restricciones de longitud; un nombre de archivo válido en una carpeta puede dejar de ser válido si se mueve a otra carpeta. Las reglas para nombrar archivos y carpetas se encuentran en los documentos de Microsoft.

En general, no puede utilizar texto generado por el usuario para crear nombres de directorio de Windows. Si desea permitir que los usuarios nombren lo que quieran, debe crear nombres seguros como A,, etc., almacenar los nombres generados por el usuario y sus equivalentes de ruta en un archivo de datos de la aplicación y realizar un mapeo de rutas en su aplicación AB.A2

Si es absolutamente necesario permitir nombres de carpetas generados por el usuario, la única forma de saber si no son válidos es detectar excepciones y asumir que el nombre no es válido. Incluso eso está lleno de peligros, ya que las excepciones lanzadas por acceso denegado, unidades fuera de línea y falta de espacio en el disco se superponen con aquellas que se pueden lanzar por nombres no válidos. Estás abriendo una enorme lata de dolor.

Dour High Arch avatar Dec 29 '2009 18:12 Dour High Arch

En Linux y otros sistemas relacionados con Unix, tradicionalmente sólo había dos caracteres que no podían aparecer en el nombre de un archivo o directorio: NUL '\0'y barra diagonal '/'. La barra diagonal, por supuesto, puede aparecer en el nombre de una ruta, separando los componentes del directorio.

Se rumorea que Steven Bourne (famoso por 'shell') tenía un directorio que contenía 254 archivos, uno por cada letra (código de carácter) que puede aparecer en el nombre de un archivo (excluyendo /,; '\0'el nombre .era el directorio actual, por supuesto). ). Se utilizaba para probar el shell Bourne y habitualmente causaba estragos en programas desprevenidos, como los programas de copia de seguridad.

Otras personas han cubierto las reglas para los nombres de archivos de Windows, con enlaces a Microsoft y Wikipedia sobre el tema.

Tenga en cuenta que MacOS X tiene un sistema de archivos que no distingue entre mayúsculas y minúsculas. Las versiones actuales parecen permitir dos puntos :en los nombres de archivos, aunque históricamente, ese no fue necesariamente siempre el caso:

$ echo a:b > a:b
$ ls -l a:b
-rw-r--r--  1 jonathanleffler  staff  4 Nov 12 07:38 a:b
$

Sin embargo, al menos con macOS Big Sur 11.7, el sistema de archivos no permite nombres de archivos que no sean cadenas UTF-8 válidas. Eso significa que el nombre del archivo no puede constar de bytes que siempre no son válidos en UTF-8 (0xC0, 0xC1, 0xF5-0xFF), y no puede usar los bytes de continuación 0x80..0xBF como el único byte en un nombre de archivo. El error dado es 92 secuencia de bytes ilegal.

POSIX define un conjunto de caracteres de nombre de archivo portátil que consta de:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

Seguir con nombres formados únicamente a partir de esos caracteres evita la mayoría de los problemas, aunque Windows aún agrega algunas complicaciones.


1 Fueron Kernighan y Pike en ['La práctica de la programación'](https://www.cs.princeton.edu/~bwk/tpop.webpage/) quienes dijeron lo mismo en el Capítulo 6, Pruebas, §6.5 Pruebas de estrés. :

Cuando Steve Bourne estaba escribiendo su shell Unix (que llegó a ser conocido como el shell Bourne), creó un directorio de 254 archivos con nombres de un carácter, uno para cada valor de byte excepto '\0'y barra, los dos caracteres que no pueden aparecer en Unix. nombres de archivos. Usó ese directorio para todo tipo de pruebas de coincidencia de patrones y tokenización. (El directorio de prueba fue, por supuesto, creado por un programa). Durante años, ese directorio fue la pesadilla de los programas de exploración de árboles de archivos; los puso a prueba hasta la destrucción.

Tenga en cuenta que el directorio debe haber contenido entradas .y .., por lo que podría decirse que eran 253 archivos (y 2 directorios), o 255 entradas de nombres, en lugar de 254 archivos. Esto no afecta la efectividad de la anécdota ni las pruebas cuidadosas que describe.

TPOP estaba anteriormente en http://plan9.bell-labs.com/cm/cs/tpop y http://cm.bell-labs.com/cm/cs/tpop pero ahora ambos están (2021-11-12) roto. Véase también Wikipedia sobre TPOP .

Jonathan Leffler avatar Dec 29 '2009 18:12 Jonathan Leffler