Asignación de nombres a archivos, rutas de acceso y espacios de nombres
Los sistemas de archivos compatibles con Windows usan el concepto de archivos y directorios para acceder a los datos almacenados en un disco o dispositivo. Los desarrolladores de Windows que trabajan con las API de Windows para E/S de archivos y dispositivos deben comprender las reglas, las convenciones y las limitaciones de los nombres de los archivos y directorios.
Se puede acceder a los datos desde discos, dispositivos y recursos compartidos de red mediante las API de E/S de archivos. Los archivos y directorios, junto con los espacios de nombres, forman parte del concepto de una ruta de acceso, que es una representación de cadena de dónde obtener los datos, independientemente de si procede de un disco, un dispositivo o una conexión de red para una operación específica.
Algunos sistemas de archivos, como NTFS, admiten archivos vinculados y directorios, que también siguen las convenciones y reglas de nomenclatura de archivos como lo haría un archivo o directorio normales. Para obtener más información, consulte Vínculos duros y uniones y Puntos de reanálisis y operaciones de archivo.
Para obtener información sobre cómo configurar Windows para admitir rutas de acceso largas de archivos, consulte Limitación de longitud máxima de la ruta de acceso.
Nombres de archivo y directorio
Todos los sistemas de archivos siguen las mismas convenciones de nomenclatura generales para un archivo: un nombre de archivo base y una extensión opcional, separadas por un punto. Sin embargo, cada sistema de archivos (como NTFS, CDFS, exFAT, UDFS, FAT o FAT32) puede tener reglas específicas y diferentes sobre la formación de los distintos componentes en la ruta de acceso a un directorio o archivo. Tenga en cuenta que un directorio es un archivo con un atributo especial que lo designa como directorio, pero que debe seguir las mismas reglas de nomenclatura que un archivo normal. Dado que el término directorio hace referencia a un tipo especial de archivo en lo que respecta al sistema de archivos, algunos materiales de referencia usarán el término general archivo para abarcar ambos conceptos de directorios y archivos de datos. Por este motivo, a menos que se especifique lo contrario, todos los ejemplos o reglas de nomenclatura o de uso de un archivo también se deben aplicar a un directorio. El término ruta de acceso hace referencia a uno o varios directorios, barras diagonales inversas y, posiblemente, un nombre de volumen. Para obtener más información, consulte la sección Rutas de acceso.
Las limitaciones del recuento de caracteres también pueden ser diferentes y pueden variar en función del formato de prefijo de nombre de ruta de acceso y sistema de archivos usado. Esto resulta más complicado por la compatibilidad con mecanismos de compatibilidad con versiones anteriores. Por ejemplo, el antiguo sistema de archivos MS-DOS FAT admite un máximo de 8 caracteres para el nombre de archivo base y 3 caracteres para la extensión, para un total de 12 caracteres, incluido el separador de puntos. Esto suele conocerse como nombre de archivo 8.3. Los sistemas de archivos FAT y NTFS de Windows no se limitan a los nombres de archivo 8.3, ya que tienen compatibilidad con nombres de archivo largos, pero aún admiten la versión 8.3 de nombres de archivo largos.
Convenciones de nomenclatura
Las siguientes reglas fundamentales permiten a las aplicaciones crear y procesar nombres válidos para archivos y directorios, independientemente del sistema de archivos:
Use un punto para separar el nombre de archivo base de la extensión en el nombre de un directorio o archivo.
Use una barra diagonal inversa (\) para separar los componentes de una ruta de acceso. La barra diagonal inversa divide el nombre de archivo de la ruta de acceso y un nombre de directorio de otro nombre de directorio en una ruta de acceso. No puede usar una barra diagonal inversa en el nombre del archivo o directorio real porque es un carácter reservado que separa los nombres en componentes.
Use una barra diagonal inversa según sea necesario como parte de los nombres de volumen (por ejemplo, "C:\" en "C:\path\file" o "\\server\share" en "\\server\share\path\file") para los nombres con la convención de nomenclatura universal (UNC). Para obtener más información sobre los nombres UNC, consulte la sección Limitación de longitud máxima de ruta de acceso.
No dé por hecho que se distingue entre mayúsculas y minúsculas. Por ejemplo, considere que los nombres OSCAR, Oscar y oscar son los mismos, aunque algunos sistemas de archivos (como los sistemas de archivos compatibles con POSIX) puedan considerarlos diferentes. Tenga en cuenta que NTFS admite la semántica POSIX para distinguir entre mayúsculas y minúsculas, pero no es el comportamiento predeterminado. Para obtener más información, consulte CreateFile.
Los designadores de volumen (letras de unidad) no distinguen entre mayúsculas y minúsculas. Por ejemplo, "D:\" y "d:\" hacen referencia al mismo volumen.
Use cualquier carácter de la página de códigos actual para un nombre, incluidos los caracteres Unicode y los caracteres del juego de caracteres extendidos (128–255), excepto los siguientes:
Los siguientes caracteres reservados:
- < (menor que)
- > (mayor que)
- : (dos puntos)
- " (comilla doble)
- / (barra diagonal)
- \ (barra diagonal inversa)
- | (barra vertical)
- ? (signo de interrogación)
- * (asterisco)
Valor entero cero, a veces denominado carácter NUL en ASCII.
Caracteres cuyas representaciones enteras están en el intervalo comprendido entre 1 y 31, excepto para los flujos de datos alternativos en los que se permiten estos caracteres. Para obtener más información sobre los flujos de archivos, consulte Flujos de archivos.
Cualquier otro carácter que el sistema de archivos de destino no permita.
Use un punto como componente de directorio en una ruta de acceso para representar el directorio actual (por ejemplo, ".\temp.txt"). Para obtener más información, consulte Rutas de acceso.
Use dos puntos consecutivos (..) como componente de directorio en una ruta de acceso para representar el elemento primario del directorio actual (por ejemplo, "..\temp.txt"). Para obtener más información, consulte Rutas de acceso.
No use los siguientes nombres reservados para el nombre de un archivo:
CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT² y LPT³. Evite también estos nombres seguidos inmediatamente de una extensión; por ejemplo, NUL.txt y NUL.tar.gz son equivalentes a NUL. Para más información, consulte Espacios de nombres.
Nota:
Windows reconoce los dígitos de superíndice ISO/IEC 8859-1 de 8 bits ¹, ² y ³ como dígitos y los trata como partes válidas de nombres de dispositivo COM# y LPT#, lo que los convierte en reservados en cada directorio. Por ejemplo, con
echo test > COM¹
no se puede crear un archivo.No finalice un nombre de archivo o directorio con un espacio o punto. Aunque el sistema de archivos subyacente puede admitir estos nombres, el shell de Windows y la interfaz de usuario no. Sin embargo, es aceptable especificar un punto como primer carácter de un nombre. Por ejemplo, ".temp".
Diferencias entre nombres cortos y largos
Se considera que un nombre de archivo largo es aquel que supera la convención de nomenclatura de estilo MS-DOS corta (también denominada 8.3). Al crear un nombre de archivo largo, Windows también puede crear un formato corto de 8.3 del nombre, denominado alias 8.3 o nombre corto, y almacenarlo también en el disco. Este alias 8.3 se puede deshabilitar por motivos de rendimiento en todo el sistema o por un volumen especificado, en función del sistema de archivos determinado.
Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: el alias 8.3 no se puede deshabilitar para los volúmenes especificados hasta Windows 7 y Windows Server 2008 R2.
En muchos sistemas de archivos, un nombre de archivo contendrá una tilde (~) dentro de cada componente del nombre que sea demasiado largo como para cumplir las reglas de nomenclatura 8.3.
Nota:
No todos los sistemas de archivos siguen la convención de sustitución de tildes y los sistemas se pueden configurar para deshabilitar la generación de alias 8.3, incluso si lo admiten normalmente. Por lo tanto, no dé por hecho que el alias 8.3 ya existe en el disco.
Para solicitar nombres de archivo 8.3, nombres de archivo largos o la ruta de acceso completa de un archivo desde el sistema, debe tener en cuenta las siguientes opciones:
- Para obtener el formato 8.3 de un nombre de archivo largo, use la función GetShortPathName.
- Para obtener la versión de nombre de archivo largo de un nombre corto, use la función GetLongPathName.
- Para obtener la ruta de acceso completa a un archivo, use la función GetFullPathName.
En los sistemas de archivos más recientes, como NTFS, exFAT, UDFS y FAT32, Windows almacena los nombres de archivo largos en el disco en Unicode, lo que significa que siempre se conserva el nombre de archivo largo original. Esto es así incluso si un nombre de archivo largo contiene caracteres extendidos, independientemente de la página de códigos que esté activa durante una operación de lectura o escritura de disco.
Los archivos que usan nombres de archivo largos se pueden copiar entre las particiones del sistema de archivos NTFS y las particiones del sistema de archivos FAT de Windows sin perder información de nombre de archivo. Esto puede no ser cierto para los sistemas de archivos MS-DOS FAT antiguos y algunos tipos de sistemas de archivos CDFS (CD-ROM), en función del nombre de archivo real. En este caso, el nombre de archivo corto se sustituye, siempre que sea posible.
Rutas de acceso
La ruta de acceso a un archivo especificado consta de uno o varios componentes, separados por un carácter especial (una barra diagonal inversa), donde cada componente suele ser un nombre de directorio o un nombre de archivo, pero con algunas excepciones notables que se describen a continuación. A menudo es esencial para la interpretación del sistema de una ruta de acceso que tiene el aspecto inicial, o prefijo, de la ruta de acceso. Este prefijo determina el espacio de nombres que usa la ruta de acceso y, además, los caracteres especiales que se usan y en qué posición se usan dentro de la ruta de acceso, incluido el último carácter.
Si un componente de una ruta de acceso es un nombre de archivo, debe ser el último componente.
Cada componente de una ruta de acceso también estará restringido por la longitud máxima especificada para un sistema de archivos determinado. En general, estas reglas se dividen en dos categorías: cortas y largas. Tenga en cuenta que el sistema de archivos almacena los nombres de directorio como un tipo especial de archivo, pero las reglas de nomenclatura de los archivos también se aplican a los nombres de directorio. En resumen, una ruta de acceso es la representación de cadena de la jerarquía entre todos los directorios que existen para un nombre de directorio o archivo determinado.
Diferencias entre rutas de acceso completas y relativas
En el caso de las funciones de la API de Windows que manipulan archivos, los nombres de archivo a menudo pueden ser relativos al directorio actual, mientras que algunas API requieren una ruta de acceso completa. Un nombre de archivo es relativo al directorio actual si no comienza por uno de los siguientes elementos:
- Un nombre UNC de cualquier formato, que siempre comienza con dos caracteres de barra diagonal inversa ("\\"). Para obtener más información, vea la siguiente sección.
- Un designador de disco con una barra diagonal inversa, por ejemplo "C:\" o "d:\".
- Una sola barra diagonal inversa, por ejemplo, "\directory" o "\file.txt". También se conoce como ruta de acceso absoluta.
Si un nombre de archivo comienza solo con un designador de disco, pero no con la barra diagonal inversa después de los dos puntos, se interpreta como una ruta de acceso relativa al directorio actual de la unidad con la letra especificada. Tenga en cuenta que el directorio actual puede ser o no el directorio raíz en función de lo que se estableció durante la operación de cambio de directorio más reciente en ese disco. A continuación figuran algunos ejemplos de este formato:
- "C:tmp.txt" hace referencia a un archivo denominado "tmp.txt" en el directorio actual de la unidad C.
- "C:tempdir\tmp.txt" hace referencia a un archivo de un subdirectorio al directorio actual de la unidad C.
También se dice que una ruta de acceso es relativa si contiene "puntos dobles"; es decir, dos puntos juntos en un componente de la ruta de acceso. Este especificador especial sirve para indicar el directorio que hay encima del directorio actual, que se conoce como "directorio primario". A continuación figuran algunos ejemplos de este formato:
- ".. \tmp.txt" especifica un archivo denominado tmp.txt ubicado en el elemento primario del directorio actual.
- ".. \.. \tmp.txt" especifica un archivo que se encuentra dos directorios por encima del directorio actual.
- ".. \tempdir\tmp.txt" especifica un archivo denominado tmp.txt ubicado en un directorio denominado tempdir, que es un directorio del mismo nivel al directorio actual.
Las rutas de acceso relativas pueden combinar ambos tipos de ejemplos (por ejemplo, "C:..\tmp.txt"). Es útil porque, aunque el sistema hace un seguimiento de la unidad actual junto con el directorio actual de esa unidad, también hace un seguimiento de los directorios actuales en cada una de las letras de unidad (si el sistema tiene más de una), independientemente del designador de unidad que se establezca como unidad actual.
Limitación de longitud máxima de la ruta de acceso
En las ediciones de Windows anteriores a Windows 10, versión 1607, la longitud máxima de una ruta de acceso es MAX_PATH, que se define como 260 caracteres. En versiones posteriores de Windows, es necesario cambiar una clave del Registro o usar la herramienta Directiva de grupo para quitar el límite. Consulte Limitación de longitud máxima de ruta de acceso para obtener información completa.
Espacios de nombres
Hay dos categorías principales de convenciones de espacios de nombres que se usan en las API de Windows, normalmente denominadas espacios de nombres NT y espacios de nombres Win32. El espacio de nombres NT se diseñó para ser el espacio de nombres de nivel más bajo en el que podrían existir otros subsistemas y espacios de nombres, incluido el subsistema Win32 y, por extensión, los espacios de nombres Win32. POSIX es otro ejemplo de un subsistema de Windows que se basa en el espacio de nombres NT. Las versiones anteriores de Windows también definieron varios nombres predefinidos o reservados para determinados dispositivos especiales, como los puertos de comunicaciones (en serie y paralelo) y la consola de visualización predeterminada como parte de lo que ahora se denomina espacio de nombres de dispositivo NT, y siguen siendo compatibles con las versiones actuales de Windows por motivos de compatibilidad con versiones anteriores.
Espacios de nombres de archivos Win32
En esta sección se resumen las convenciones y el prefijo del espacio de nombres Win32, con descripciones de su uso. Tenga en cuenta que estos ejemplos están diseñados para su uso con las funciones de la API de Windows y no funcionan necesariamente con aplicaciones del shell de Windows, como el Explorador de Windows. Por este motivo, hay un abanico más amplio de rutas de acceso posibles de las que suelen estar disponibles en las aplicaciones del shell de Windows, y las aplicaciones de Windows que lo aprovechan se pueden desarrollar mediante estas convenciones de espacio de nombres.
En el caso de la E/S de archivo, el prefijo "\\?\\ " en una cadena de ruta de acceso indica a las API de Windows que deshabiliten todo el análisis de cadenas y envíen la cadena que la sigue directamente al sistema de archivos. Por ejemplo, si el sistema de archivos admite rutas de acceso y nombres de archivo grandes, puede superar los límites de MAX_PATH que, de lo contrario, aplicarán las API de Windows.
Dado que desactiva la expansión automática de la cadena de ruta de acceso, el prefijo "\\?\" también permite el uso de ".." y "." en los nombres de rutas de acceso, lo que puede ser útil si está intentando realizar operaciones en un archivo con estos especificadores de ruta de acceso relativa reservados como parte de la ruta de acceso completa.
Muchas, pero no todas las API de E/S de archivos admiten "\\?\"; consulte el tema de referencia de cada API para asegurarse de ello.
Tenga en cuenta que deben usarse API Unicode para asegurarse de que el prefijo "\\?\" le permite superar MAX_PATH.
Espacios de nombres de dispositivos Win32
El prefijo "\\.\" tendrá acceso al espacio de nombres de dispositivo Win32 en lugar del espacio de nombres de archivo Win32. Así se accede directamente a los discos físicos y volúmenes, sin pasar por el sistema de archivos, si la API admite este tipo de acceso. Puede acceder de esta manera a muchos dispositivos distintos de los discos (por ejemplo, con las funciones CreateFile y DefineDosDevice).
Por ejemplo, si desea abrir el puerto 1 de comunicaciones en serie del sistema, puede usar "COM1" en la llamada a la función CreateFile. Funciona porque COM1-COM9 forman parte de los nombres reservados en el espacio de nombres NT, aunque el uso del prefijo "\\.\" también funcionará con estos nombres de dispositivos. Por comparación, si tiene instalada una placa de expansión en serie de 100 puertos y desea abrir COM56, no podrá abrirla con "COM56" porque no hay ningún espacio de nombres NT predefinido para COM56. Tendrá que abrirla con "\\.\COM56" porque "\\.\" va directamente al espacio de nombres del dispositivo sin intentar localizar un alias predefinido.
Otro ejemplo de uso del espacio de nombres de dispositivo Win32 es usar la función CreateFile con "\\.\PhysicalDriveX" (donde X es un valor entero válido) o "\\.\CdRomX". Esto le permite acceder directamente a esos dispositivos, omitiendo el sistema de archivos. Funciona porque el sistema crea estos nombres de dispositivos a medida que se enumeran estos dispositivos, y algunos controladores también crearán otros alias en el sistema. Por ejemplo, el controlador de dispositivo que implementa el nombre "C:\" tiene su propio espacio de nombres, que también resulta ser el sistema de archivos.
Las API que pasan por la función CreateFile suelen funcionar con el prefijo "\\.\" porque CreateFile es la función que se usa para abrir archivos y dispositivos, en función de los parámetros que use.
Si trabaja con funciones de la API de Windows, debe usar el prefijo "\\.\" para acceder solo a los dispositivos, y no a los archivos.
La mayoría de las API no admiten "\\.\"; solo lo reconocerán las que están diseñadas para trabajar con el espacio de nombres del dispositivo. Consulte siempre el tema de referencia de cada API para asegurarse de ello.
Espacios de nombres NT
También hay API que permiten el uso de la convención de espacio de nombres NT, pero el Administrador de objetos de Windows hace que sea innecesario en la mayoría de los casos. Para ilustrarlo, resulta útil examinar los espacios de nombres de Windows en el explorador de objetos del sistema mediante la herramienta Windows WinObj Sysinternals. Al ejecutar esta herramienta, lo que ve es el espacio de nombres NT que comienza en la raíz o "\". La subcarpeta denominada "Global??" es donde reside el espacio de nombres Win32. Los objetos de dispositivo con nombre residen en el espacio de nombres NT dentro del subdirectorio "Device". Aquí también puede encontrar Serial0 y Serial1, los objetos de dispositivo que representan los dos primeros puertos COM si están presentes en el sistema. Un objeto de dispositivo que representa un volumen sería similar a "HarddiskVolume1", aunque el sufijo numérico puede variar. El nombre "DR0" del subdirectorio "Harddisk0" es un ejemplo del objeto de dispositivo que representa un disco, etc.
Para que las aplicaciones de Windows puedan acceder a estos objetos de dispositivo, los controladores de dispositivo crean un vínculo simbólico en el espacio de nombres Win32, "Global??", a sus respectivos objetos de dispositivo. Por ejemplo, COM0 y COM1 en el subdirectorio "Global??" son vínculos simbólicos a Serial0 y Serial1, "C:" es un vínculo simbólico a HarddiskVolume1, "Physicaldrive0" es un vínculo simbólico a DR0, etc. Sin un vínculo simbólico, un dispositivo especificado como "Xxx" no estará disponible para ninguna aplicación de Windows mediante convenciones de espacios de nombres Win32, como se ha descrito anteriormente. Sin embargo, se podría abrir un identificador en ese dispositivo mediante cualquier API que admita la ruta de acceso absoluta del espacio de nombres NT con el formato "\Device\Xxx".
Con la adición de compatibilidad con varios usuarios a través de Terminal Services y máquinas virtuales, es necesario virtualizar aún más el dispositivo raíz de todo el sistema dentro del espacio de nombres Win32. Esto se logra agregando el vínculo simbólico denominado "GLOBALROOT" al espacio de nombres Win32, que puede ver en el subdirectorio "Global??" de la herramienta del explorador WinObj que se ha descrito anteriormente y a la que puede acceder a través de la ruta de acceso "\\?\GLOBALROOT". Este prefijo garantiza que la ruta de acceso siguiente se vea en la ruta de acceso raíz verdadera del administrador de objetos del sistema, y no en una ruta dependiente de la sesión.