En corto

PowerShell como administrador:

1
2
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
  -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force

Reinicia (o al menos los programas afectados). Por directiva de grupo, lo mismo en Configuración del equipo → Plantillas administrativas → Sistema → Sistema de archivos → Habilitar rutas de acceso largas de Win32.

Con eso, los programas que se declaran compatibles dejan de fallar con rutas de más de 260 caracteres. Los que no, siguen igual: para esos, el prefijo \\?\, subst o robocopy.

El problema

1
2
3
The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters.
error: unable to create file ...: Filename too long          # git
System.IO.PathTooLongException                              # .NET

MAX_PATH son 260 caracteres contando la letra de unidad y el NUL final. Se pasa fácil con node_modules, clones de git con nombres largos, respaldos que anidan carpetas, o una sincronización que trae una estructura profunda de otro sistema.

Qué hace la clave

Desde Windows 10 1607 (y Server 2016), muchas funciones de archivo de Win32 (CreateFileW, CopyFileW, MoveFileW, FindFirstFileW, CreateDirectoryW…) aceptan rutas hasta unos 32 767 caracteres si se cumplen dos condiciones:

  1. LongPathsEnabled = 1 en el registro (o la directiva).
  2. El programa declara longPathAware en su manifiesto.

Windows lee el valor una vez por proceso, en la primera llamada a esas funciones. De ahí el reinicio: los procesos que ya estaban corriendo (Explorador, servicios) siguen con el valor viejo.

Programa¿Respeta rutas largas con la clave activa?
PowerShell 7Sí
Windows PowerShell 5.1A medias; depende del cmdlet
.NET (Core) y apps modernasSí
Git para WindowsSí, con git config --system core.longpaths true
robocopy, 7-ZipSí (usan \\?\ por su cuenta, con o sin clave)
cmd.exe (dir, copy, del)No
Explorador de archivosParcial; sigue tropezando al copiar o borrar
Aplicaciones antiguasNo, y no hay forma de obligarlas

Comprobar el valor:

1
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathsEnabled

Prueba rápida en PowerShell 7:

1
2
3
4
$p = "C:\t\" + ("a" * 200) + "\" + ("b" * 100)
New-Item -ItemType Directory -Path $p -Force | Out-Null
Get-ChildItem "C:\t" -Recurse | Measure-Object
Remove-Item "C:\t" -Recurse -Force

Plan B cuando el programa no coopera

  • Prefijo \\?\: le dice a Windows que pase la ruta tal cual, sin el límite. Funciona en cualquier versión y sin tocar el registro, pero solo con rutas absolutas y sin ./... Para UNC: \\?\UNC\servidor\recurso\....

    1
    2
    
    dir \\?\C:\proyectos\muy\profundo
    rd /s /q \\?\C:\proyectos\muy\profundo\node_modules
    
  • Acortar la ruta: subst X: C:\proyectos\muy\profundo crea una unidad que empieza de cero; net use hace lo mismo con rutas UNC.

  • Borrar lo que nadie puede borrar: robocopy C:\vacia C:\ruta\imposible /MIR con una carpeta vacía deja la carpeta destino vacía y ya se puede quitar.

  • Git: core.longpaths true y, en Windows, clona cerca de la raíz (C:\src\repo) en vez de dentro de Documentos.

Trampas

  • La clave no es un interruptor global. Es una autorización que cada programa tiene que reclamar; activarla no rompe nada, pero tampoco arregla programas que no la piden.
  • Reinicio. Sin él, el Explorador y los servicios siguen con el valor cacheado.
  • Nombres de componente: cada carpeta o archivo sigue limitado a 255 caracteres; lo que crece es el total.
  • Rutas relativas siempre quedan limitadas a 260, con o sin clave.
  • Compatibilidad hacia atrás: un archivo creado en una ruta larga puede no abrirse desde un programa viejo en la misma máquina. Si compartes carpetas con software legacy, mantén las rutas cortas.

Extra: archivos de prueba del tamaño exacto

Para probar transferencias, cuotas o espacio sin buscar un archivo grande:

1
2
fsutil file createnew C:\temp\dummy-1G.bin 1073741824
fsutil file createnew C:\temp\dummy-100M.bin 104857600

Crea al instante un archivo del tamaño indicado en bytes, sin escribir datos (se lee como ceros). Como ventaja, es instantáneo aunque pidas 50 GB; como desventaja, comprime a nada, así que no sirve para medir rendimiento de compresión o deduplicación.

Referencia: Maximum Path Length Limitation en Microsoft Learn.