¿Por qué existe el límite de longitud de ruta de 260 caracteres en Windows?
Me he encontrado con este problema varias veces en momentos inoportunos:
- Intentando trabajar en proyectos Java de código abierto con rutas profundas
- Almacenamiento de árboles wiki profundos de Fitnesse en el control de fuente
- Un error al intentar usar Bazaar para importar mi árbol de control de fuente
¿Por qué existe este límite?
¿Por qué no lo han eliminado todavía?
¿Cómo afrontas el límite del camino? Y no, cambiar a Linux o Mac OS X no es una respuesta válida a esta pregunta;)
Citando este artículo https://learn.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Limitación de longitud máxima de ruta
En la API de Windows (con algunas excepciones que se analizan en los párrafos siguientes), la longitud máxima de una ruta es MAX_PATH , que se define como 260 caracteres. Una ruta local está estructurada en el siguiente orden: letra de unidad, dos puntos, barra invertida, componentes de nombre separados por barras invertidas y un carácter nulo de terminación. Por ejemplo, la ruta máxima en la unidad D es "D:\ una cadena de ruta de 256 caracteres <NUL>", donde "<NUL>" representa el carácter nulo final invisible para la página de códigos del sistema actual. (Los caracteres < > se utilizan aquí para mayor claridad visual y no pueden ser parte de una cadena de ruta válida).
Ahora vemos que es 1+2+256+1 o [unidad][:\][ruta][null] = 260. Se podría suponer que 256 es una longitud de cadena fija razonable de los días de DOS. Y volviendo a las API de DOS, nos damos cuenta de que el sistema rastreó la ruta actual por unidad, y tenemos 26 (32 con símbolos) unidades máximas (y directorios actuales).
El INT 0x21 AH=0x47 dice "Esta función devuelve la descripción de la ruta sin la letra de la unidad y la barra invertida inicial". Entonces vemos que el sistema almacena el CWD como un par (unidad, ruta) y usted solicita la ruta especificando la unidad (1=A, 2=B,…), si especifica un 0 entonces asume la ruta para la unidad devuelta por INT 0x21 AH=0x15 AL=0x19. Ahora sabemos por qué es 260 y no 256, porque esos 4 bytes no están almacenados en la cadena de ruta.
¿Por qué una cadena de ruta de 256 bytes? Porque 640 K es suficiente RAM.
Esto no es estrictamente cierto ya que el sistema de archivos NTFS admite rutas de hasta 32k caracteres. Puede utilizar la API de Win32 y \\?\
el prefijo " " en la ruta para utilizar más de 260 caracteres.
Una explicación detallada del largo camino del blog del equipo .Net BCL .
Un pequeño extracto destaca el problema de los caminos largos.
Otra preocupación es el comportamiento inconsistente que resultaría de exponer el soporte de largo recorrido.
\\?\
Se pueden utilizar rutas largas con el prefijo en la mayoría de las API de Windows relacionadas con archivos, pero no en todas las API de Windows. Por ejemplo, LoadLibrary, que asigna un módulo a la dirección del proceso de llamada, falla si el nombre del archivo es más largo que MAX_PATH. Entonces, esto significa que MoveFile le permitirá mover una DLL a una ubicación tal que su ruta tenga más de 260 caracteres, pero cuando intente cargar la DLL, fallará. Hay ejemplos similares en todas las API de Windows; Existen algunas soluciones, pero se analizan caso por caso.