Asignar nombres a archivos, rutas de acceso y espacios de nombres

Todos 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 distintas reglas, convenciones y limitaciones de nombres para 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 o 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, vea Vínculos duros y uniones ypuntos de reanálisis y operaciones de archivo.

Para obtener más información, consulte las siguientes subsecciones:

Para obtener información sobre cómo configurar Windows 10 para admitir rutas de acceso largas de archivos, consulte Limitación de longitud máxima de ruta de acceso.

Nombres de archivo y directorio

Todos los sistemas de archivos siguen las mismas convenciones de nomenclatura generales para un archivo individual: 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 y FAT32, puede tener reglas específicas y diferentes sobre la formación de los componentes individuales en la ruta de acceso a un directorio o archivo. Tenga en cuenta que un directorio es simplemente un archivo con un atributo especial que lo designa como directorio, pero de lo contrario debe seguir todas las mismas reglas de nomenclatura que un archivo normal. Dado que el término directorio simplemente hace referencia a un tipo especial de archivo en lo que respecta al sistema de archivos, algunos materiales de referencia usarán el archivo de términos general para abarcar ambos conceptos de directorios y archivos de datos como tal. Por este motivo, a menos que se especifique lo contrario, cualquier regla de nomenclatura o uso o ejemplos de un archivo también se debe aplicar a un directorio. La ruta de acceso del término 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 es más complicado por la compatibilidad con mecanismos de compatibilidad con versiones anteriores. Por ejemplo, el sistema de archivos FAT ms-DOS anterior 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 se conoce comúnmente como un 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 todavía 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 nombres de Convención de nomenclatura universal (UNC). Para obtener más información sobre los nombres UNC, vea la sección Limitación de longitud máxima de ruta de acceso.

  • No asuma la distinción 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 un sistema de archivos compatible con POSIX) puedan considerarlos como diferentes. Tenga en cuenta que NTFS admite la semántica POSIX para la distinción entre mayúsculas y minúsculas, pero no es el comportamiento predeterminado. Para obtener más información, vea CreateFile.

  • Los designadores de volumen (letras de unidad) no distinguen mayúsculas de minúsculas. Por ejemplo, "D:\" y "d:\" consulte el 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 o canalización)
      • ? (signo de interrogación)
      • * (asterisco)
    • Valor entero cero, a veces denominado carácter NUL ASCII.

    • Caracteres cuyas representaciones enteras están en el intervalo comprendido entre 1 y 31, excepto para flujos de datos alternativos en los que se permiten estos caracteres. Para obtener más información sobre las secuencias de archivos, vea Secuencias 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, vea Rutas de acceso.

  • Use dos puntos consecutivos (..) como componente de directorio en una ruta de acceso para representar al elemento primario del directorio actual, por ejemplo ". \temp.txt". Para obtener más información, vea 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, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 y LPT9. 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.

  • No finalice un nombre de archivo o directorio con un espacio o un 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".

Nombres cortos frente a largos

Se considera que un nombre de archivo largo es cualquier nombre de archivo que supere 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 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 es demasiado largo para cumplir con 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 normalmente lo admiten. Por lo tanto, no asuma 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, tenga 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 el nombre de archivo largo original siempre se conserva. Esto es true 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 si es 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), con cada componente normalmente un nombre de directorio o un nombre de archivo, pero con algunas excepciones notables que se describen a continuación. A menudo es fundamental 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, qué caracteres especiales se usan en la posición 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: corta y larga. 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 simplemente la representación de cadena de la jerarquía entre todos los directorios que existen para un nombre de directorio o archivo determinado.

Rutas de acceso completas frente a 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". Esto también se conoce como una 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ó en durante la operación de "cambiar directorio" más reciente en ese disco. Los ejemplos de este formato son los siguientes:

  • "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 se usa para indicar el directorio encima del directorio actual, lo que se conoce como "directorio primario". Los ejemplos de este formato son los siguientes:

  • ".. \tmp.txt" especifica un archivo denominado tmp.txt ubicado en el elemento primario del directorio actual.
  • ".. \.. \tmp.txt" especifica un archivo que es dos directorios 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 ejemplo, por ejemplo, "C:..\tmp.txt". Esto es útil porque, aunque el sistema realiza un seguimiento de la unidad actual junto con el directorio actual de esa unidad, también realiza un seguimiento de los directorios actuales en cada una de las diferentes letras de unidad (si el sistema tiene más de uno), independientemente del designador de unidad se establezca como la 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 máxima de longitud de ruta de acceso para obtener detalles completos.

Espacios de nombres

Hay dos categorías principales de convenciones de espacio 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 (serie y paralelo) y la consola de visualización predeterminada como parte de lo que ahora se denomina espacio de nombres del dispositivo NT, y siguen siendo compatibles con las versiones actuales de Windows por motivos de compatibilidad con versiones anteriores.

Espacios de nombres de archivo Win32

En esta sección se resumen las convenciones y el prefijo del espacio de nombres Win32, con descripciones de cómo se usan. 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 de shell de Windows, como el Explorador de Windows. Por este motivo, hay una gama más amplia de rutas de acceso posibles de las que normalmente están disponibles en las aplicaciones de shell de Windows, y las aplicaciones de Windows que aprovechan esto 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 grandes y nombres de archivo, puede superar los límites de MAX_PATH que, de lo contrario, aplican las API de Windows. Para obtener más información sobre la limitación de ruta de acceso máxima normal, consulte la sección anterior Limitación de longitud máxima de ruta de acceso.

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 ruta 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 "\\?\"; Debe examinar el tema de referencia de cada API para asegurarse de que.

Tenga en cuenta que las API Unicode deben usarse para asegurarse de que el prefijo "\\?\" le permite superar el MAX_PATH

Espacios de nombres de dispositivo Win32

El prefijo "\\.\" tendrá acceso al espacio de nombres de dispositivo Win32 en lugar del espacio de nombres de archivo Win32. Así es como el acceso a discos físicos y volúmenes se logra directamente, sin pasar por el sistema de archivos, si la API admite este tipo de acceso. Puede acceder a muchos dispositivos distintos de los discos de esta manera (mediante las funciones CreateFile y DefineDosDevice , por ejemplo).

Por ejemplo, si desea abrir el puerto 1 de comunicaciones serie del sistema, puede usar "COM1" en la llamada a la función CreateFile . Esto 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 dispositivo. Por comparación, si tiene una placa de expansión serie de 100 puertos instalada y desea abrir COM56, no puede abrirla con "COM56" porque no hay ningún espacio de nombres NT predefinido para COM56. Tendrá que abrirlo 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. Esto funciona porque el sistema crea estos nombres de dispositivo 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 sucede que es 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 los que están diseñados para trabajar con el espacio de nombres del dispositivo lo reconocerán. Compruebe siempre el tema de referencia de cada API para asegurarse.

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 Sysinternals WinObj . 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" en el 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 (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 simplemente 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 "Xxx" no estará disponible para ninguna aplicación de Windows mediante convenciones de espacio 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 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.

Comparación de la funcionalidad del sistema de archivos