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:\some 256-character path stringNUL<>", 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 tiene nombres de archivo largos en una carpeta que tiene 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 a un nombre de estilo NT, excepto cuando se usa el prefijo "\\?\\", tal y 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 extendida para una longitud máxima de ruta de acceso total de 32 767 caracteres. Este tipo de ruta de acceso se compone de componentes separados por barras diagonales inversas, cada una hasta el valor devuelto en el parámetro lpMaximumComponentLength de la función GetVolumeInformation (este valor suele tener 255 caracteres). Para especificar una ruta de acceso de longitud extendida, use el prefijo "\\?\\ ". Por ejemplo, "\\?\D:\very long path".

Nota

La ruta de acceso máxima de 32 767 caracteres es aproximada, ya que el prefijo "\\?\\ " puede expandirse a una cadena más larga por el sistema en tiempo de ejecución y esta expansió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 esta ruta de acceso 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 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 nombre de archivo y ruta de acceso para su uso por parte de las funciones de API de E/S de archivos 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 funciones de API de E/S de archivos 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.

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

A partir de Windows 10, versión 1607, MAX_PATH limitaciones se han quitado de las funciones comunes de archivos y directorios win32. Sin embargo, debe participar en el nuevo comportamiento.

Para habilitar el nuevo comportamiento de ruta de acceso larga, se deben cumplir las dos condiciones siguientes:

  • La clave Computer\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 de la clave (por proceso) después de la primera llamada a una función de directorio o archivo Win32 afectada (consulte a continuación la lista de funciones). La clave del Registro no se volverá a cargar durante la vigencia del proceso. Para que todas las aplicaciones del sistema reconozcan el valor de la clave, 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 .reg archivo que pueda establecerlo por usted 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 clave del Registro también se puede controlar a través de directiva de grupo en Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths.

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

    <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>
    

Estas son las funciones de administración de directorios que ya no tienen restricciones MAX_PATH si opta por 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 opta por 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.