Limitación de longitud máxima de la ruta de acceso

En la API de Windows (con algunas excepciones descritas en los párrafos siguientes), la longitud máxima de una ruta de acceso es MAX_PATH, que se define como 260 caracteres. Una ruta de acceso local se estructura en el orden siguiente: letra de unidad, dos puntos, barra diagonal inversa, componentes de nombre separados por barras diagonales inversas y un carácter nulo de terminación. Por ejemplo, la ruta de acceso máxima de la unidad D es "D:\una cadena de ruta de acceso de 256 caracteres<NUL>" donde "<NUL>" representa el carácter nulo de terminación invisible para la página de códigos del sistema actual. (Los caracteres <> se usan aquí para mayor claridad visual y no pueden formar parte de una cadena de ruta de acceso válida).

Por ejemplo, puede alcanzar esta limitación si va a clonar un repositorio de Git que tenga nombres de archivo largos en una carpeta que tenga un nombre largo.

Nota:

Las funciones de E/S de archivos de la API de Windows convierten "/" en "\" como parte de la conversión del nombre en un nombre de estilo NT, excepto cuando se usa el prefijo "\\?\\" como se detalla en las secciones siguientes.

La API de Windows tiene muchas funciones que también tienen versiones Unicode para permitir una ruta de acceso de longitud ampliada para una longitud de ruta de acceso total máxima de 32 767 caracteres. Este tipo de ruta de acceso consta de componentes separados por barras diagonales inversas, cada uno hasta el valor devuelto en el parámetro lpMaximumComponentLength de la función GetVolumeInformation (este valor suele ser de 255 caracteres). Para especificar una ruta de acceso de longitud extendida, use el prefijo "\\?\". Por ejemplo, "\\?\D:\ruta de acceso muy larga".

Nota:

La ruta de acceso máxima de 32 767 caracteres es aproximada, ya que el sistema puede ampliar el prefijo "\\?\\ a una cadena más larga en tiempo de ejecución y esta ampliación se aplica a la longitud total.

El prefijo "\\?\" también se puede usar con rutas de acceso construidas según la convención de nomenclatura universal (UNC). Para especificar una ruta de acceso de este tipo mediante UNC, use el prefijo "\\?\UNC\". Por ejemplo, "\\?\UNC\server\share", donde "server" es el nombre del equipo y "share" es el nombre de la carpeta compartida. Estos prefijos no se usan como parte de la propia ruta de acceso. Indican que la ruta de acceso debe pasarse al sistema con una modificación mínima, lo que significa que no se pueden usar barras diagonales para representar separadores de ruta de acceso, o un punto para representar el directorio actual o puntos dobles para representar el directorio primario. Dado que no se puede usar el prefijo "\\?\" con una ruta de acceso relativa, las rutas de acceso relativas siempre se limitan a un total de MAX_PATH caracteres.

No es necesario realizar ninguna normalización Unicode en las cadenas de ruta de acceso y nombre de archivo para que las usen las funciones de API de E/S de archivos de Windows, porque el sistema de archivos trata la ruta de acceso y los nombres de archivo como una secuencia opaca de WCHARs. Cualquier normalización que requiera la aplicación debe realizarse teniendo esto en cuenta, externamente a las llamadas a las funciones de API de E/S de archivos de Windows relacionadas.

Cuando se usa una API para crear un directorio, la ruta de acceso especificada no puede ser tan larga que no se pueda anexar un nombre de archivo 8.3 (es decir, el nombre del directorio no puede superar MAX_PATH menos 12).

El shell y el sistema de archivos tienen requisitos diferentes. Es posible crear una ruta de acceso con la API de Windows que la interfaz de usuario del shell no pueda interpretar correctamente.

Habilitación de rutas de acceso largas en Windows 10, versión 1607 y versiones posteriores

A partir de Windows 10, versión 1607, las limitaciones de MAX_PATH se han eliminado de muchas funciones comunes de archivos y directorios de Win32. Sin embargo, se debe habilitar la aplicación para este nuevo comportamiento.

Para habilitar el nuevo comportamiento de ruta de acceso larga por aplicación, se deben cumplir dos condiciones. Se debe establecer un valor del Registro y el manifiesto de aplicación debe incluir el elemento longPathAware.

Configuración del Registro para habilitar rutas de acceso largas

Importante

Se debe tener en cuenta que la habilitación de esta configuración del Registro solo afectará a las aplicaciones que se han modificado para aprovechar las ventajas de la nueva característica. Los desarrolladores deben declarar sus aplicaciones para que tengan en cuenta la ruta de acceso larga, como se describe en la configuración del manifiesto de aplicación que se muestra a continuación. Este cambio no afectará a todas las aplicaciones.

El valor HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD) del Registro debe existir y establecerse en 1. El sistema almacenará en caché el valor del Registro (por proceso) después de la primera llamada a una función de directorio o archivo Win32 afectada (consulte la lista de funciones a continuación). El valor del Registro no se volverá a cargar durante la vigencia del proceso. Para que todas las aplicaciones del sistema reconozcan el valor, es posible que se requiera un reinicio porque es posible que algunos procesos se hayan iniciado antes de establecer la clave.

También puede copiar este código en un archivo .reg que pueda establecerlo automáticamente o usar el comando de PowerShell desde una ventana de terminal con privilegios elevados:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

Nota:

Esta configuración del Registro también se puede controlar a través de la directiva de grupo en Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths.

Actualizaciones del manifiesto de aplicación para declarar la funcionalidad de ruta de acceso larga

El manifiesto de aplicación también debe incluir el elemento longPathAware.

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
        <ws2:longPathAware>true</ws2:longPathAware>
    </windowsSettings>
</application>

Funciones sin restricciones de MAX_PATH

Estas son las funciones de administración de directorios que ya no tienen restricciones de MAX_PATH si se habilita el comportamiento de ruta de acceso larga: CreateDirectoryW, CreateDirectoryExW, GetCurrentDirectoryW, RemoveDirectoryW, SetCurrentDirectoryW.

Estas son las funciones de administración de archivos que ya no tienen restricciones de MAX_PATH si se habilita el comportamiento de ruta de acceso larga: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.

Consulte también

Funciones de administración de archivos

Funciones de administración de directorios

GetVolumeInformation