Me he encontrado con este problema varias veces en momentos inoportunos:
- Intentando trabajar en proyectos Java de código abierto con rutas profundas
- Almacenar árboles wiki de Fitnesse profundos en el control de fuente
- Un error al intentar usar Bazaar para importar mi árbol de control de código fuente
¿Por qué existe este límite?
¿Por qué no se ha 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;)
Respuestas:
Citando este artículo https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Ahora vemos que es 1 + 2 + 256 + 1 o [unidad] [: \] [ruta] [nulo] = 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 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. Entonces, 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 640K es suficiente RAM.
fuente
Esto no es estrictamente cierto ya que el sistema de archivos NTFS admite rutas de hasta 32k caracteres. Puede usar la api win32 y el
\\?\
prefijo " " de la ruta para usar más de 260 caracteres.Una explicación detallada del largo camino del blog del equipo .Net BCL .
Un pequeño extracto resalta el problema con caminos largos
fuente
La pregunta es por qué todavía existe la limitación. Sin duda, Windows moderno puede aumentar el lado de
MAX_PATH
permitir caminos más largos. ¿Por qué no se ha eliminado la limitación?A través del contrato de API, Windows ha garantizado a todas las aplicaciones que las API de archivos estándar nunca devolverán una ruta más larga que los
260
caracteres.Considere el siguiente código correcto :
Windows garantizó a mi programa que llenaría mi
WIN32_FIND_DATA
estructura:Mi aplicación no declaró el valor de la constante
MAX_PATH
, lo hizo la API de Windows. Mi aplicación usó ese valor definido.Mi estructura está definida correctamente y solo asigna
592
bytes en total. Eso significa que solo puedo recibir un nombre de archivo con menos de260
caracteres. Windows me prometió que si escribía mi aplicación correctamente, mi aplicación continuaría funcionando en el futuro.Si Windows permitiera nombres de archivo más largos que
260
caracteres, entonces mi aplicación existente (que usaba la API correcta correctamente) fallaría.Para cualquiera que llame a Microsoft para cambiar la
MAX_PATH
constante, primero deben asegurarse de que ninguna aplicación existente falle. Por ejemplo, todavía poseo y uso una aplicación de Windows que se escribió para ejecutarse en Windows 3.11. Todavía se ejecuta en Windows 10 de 64 bits. Eso es lo que le brinda la compatibilidad con versiones anteriores.Microsoft hizo crear una manera de utilizar los 32.768 nombres completos de rutas; pero tuvieron que crear un nuevo contrato de API para hacerlo. Por un lado, debe usar la API de Shell para enumerar archivos (ya que no todos los archivos existen en un disco duro o recurso compartido de red).
Pero también tienen que no romper las aplicaciones de usuario existentes. La gran mayoría de las aplicaciones no utilizan la API de shell para el trabajo de archivos. Todos simplemente llaman
FindFirstFile
/FindNextFile
y lo llaman un día.fuente
Desde Windows 10. puede eliminar la limitación modificando una clave de registro.
fuente
Puede montar una carpeta como unidad. Desde la línea de comando, si tiene una ruta
C:\path\to\long\folder
, puede asignarla a la letra de unidadX:
usando:fuente
subst
es local-session / account - vea superuser.com/questions/29072/… para saber cómo hacerlo 'en todo el sistema'Una forma de hacer frente al límite de ruta es acortar las entradas de ruta con enlaces simbólicos.
Por ejemplo:
C:\p
directorio para mantener enlaces cortos a rutas largasmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
a su ruta en lugar de la ruta largafuente
/j
opción crea un punto de montaje de unión para un dispositivo de volumen local o una ruta en un volumen local (como un montaje de enlace Unix). No crea un enlace simbólico. Es una distinción importante ya que los puntos de montaje de unión siempre se evalúan en un servidor y deben apuntar a dispositivos locales, mientras que los enlaces simbólicos se evalúan en el cliente y pueden apuntar a rutas remotas (si lo permite la política). Al igual que una unidad subst.exe (es decirDefineDosDeviceW
), un objetivo de unión generalmente está limitado a unos 4 k caracteres. En realidad, son 8K caracteres, divididos de manera uniforme entre la ruta de sustitución y la ruta de visualización.Puede habilitar nombres de ruta largos con PowerShell:
Otra versión es usar una Política de grupo en
Computer Configuration
/Administrative Templates
/System
/Filesystem
:fuente
En cuanto a por qué esto todavía existe: MS no lo considera una prioridad y valora la compatibilidad con versiones anteriores sobre el avance de su sistema operativo (al menos en este caso).
Una solución alternativa que uso es usar los "nombres cortos" para los directorios en la ruta, en lugar de sus versiones estándar legibles por humanos. Así , por ejemplo, para
C:\Program Files\
que yo usaríaC:\PROGRA~1\
Usted puede encontrar los equivalentes de nombre corto utilizandodir /x
.fuente
PATH
y páselo aSearchPathW
. También es eficiente, ya que la biblioteca en tiempo de ejecución crea rutas de dispositivo "\\? \" Para NT de todos modos. En cuanto a los sistemas de archivos más nuevos, probablemente no veríamos el software instalado en un volumen exFAT, que no sea aplicaciones portátiles, ya que no tiene seguridad, pero no descartaría ReFS. Los usuarios instalan programas en ubicaciones no estándar por razones de conveniencia, espacio o rendimiento.En cuanto a cómo hacer frente a la limitación de tamaño de ruta en Windows: usar 7zip para empacar (y desempaquetar) sus archivos confidenciales de longitud de ruta parece una solución viable. Lo he usado para transportar varias instalaciones IDE (esas rutas de complementos de Eclipse, ¡ay!) Y montones de documentación autogenerada y hasta ahora no he tenido un solo problema.
No estoy seguro de cómo evade el límite de 260 caracteres establecido por Windows (desde un punto de vista técnico), pero bueno, ¡funciona!
Más detalles en su página de SourceForge aquí :
y notas de lanzamiento :
NOTA IMPORTANTE: Para que esto funcione correctamente, deberá especificar la ruta de destino en el cuadro de diálogo "Extraer" de 7zip directamente, en lugar de arrastrar y soltar los archivos en la carpeta deseada. De lo contrario, la carpeta "Temp" se usará como caché provisional y rebotará en la misma limitación de 260 caracteres una vez que el Explorador de Windows comience a mover los archivos a su "lugar de descanso final". Consulte las respuestas a esta pregunta para obtener más información.
fuente
Lo hace, y es un valor predeterminado por alguna razón, pero podría anularlo fácilmente con esta clave de registro:
Ver: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
fuente
Otra forma de lidiar con esto es usar Cygwin, dependiendo de lo que desee hacer con los archivos (es decir, si los comandos de Cygwin se adaptan a sus necesidades)
Por ejemplo, permite copiar, mover o renombrar archivos que incluso el Explorador de Windows no puede. O, por supuesto, lidiar con su contenido como md5sum, grep, gzip, etc.
También para los programas que está codificando, podría vincularlos a la DLL de Cygwin y les permitiría usar rutas largas (aunque no he probado esto)
fuente