La longitud máxima de la ruta de un archivo: ¿259 o 258 caracteres?

La longitud máxima de la ruta de un archivo: ¿259 o 258 caracteres?

Intento entender cuál es la longitud máxima válida de la ruta de un archivo.

Para ello, utilizo el administrador de archivos predeterminado de Windows, en Windows 7, y el siguiente script de PowerShell:

Get-ChildItem | Select Name, FullName, @{N="Path Length";E={$_.FullName.Length}} | Format-List

Abro el administrador, creo el archivo abc.txten C:\y luego agrego letras abcsiempre que el administrador de archivos lo permita. (En realidad, uso copiar y pegar, por supuesto. Esto es mucho más rápido).

Luego hago la misma prueba en C:\aaay C:\aaa\bbb.

Por alguna razón, los resultados son diferentes. La longitud máxima en C:\aaay C:\aaa\bbbes de 259 caracteres, pero la longitud máxima en C:\es de 258 caracteres. ¿Por qué?

C:\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
258 characters

C:\aaa\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcde.txt
259 characters

C:\aaa\bbb\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_a.txt
259 characters

actualizar

De mail-archive.com, lista de Python:

(https://www.mail-archive.com/[correo electrónico protegido]/msg444514.html)

los límites de longitud de ruta clásicos de DOS (por ejemplo, 247, 258 o 259 caracteres según el contexto).

Las siguientes explicaciones son mías.

247 representa la longitud máxima de la ruta de un directorio: 260 - 12 - 1 = 247. Aquí, 12 representa el nombre de archivo 8.3 y 1 representa un terminador NUL. Por ejemplo, C:\foooC:\foo\bar

259 representa la longitud máxima del camino de unarchivo(no directorio) ubicadonoen la raíz del disco. Por ejemplo,C:\foo\aaa.txt

258 representa la longitud máxima del camino de unarchivo(no directorio) ubicadoenla raíz del disco. Por ejemplo,C:\aaa.txt

Entonces, en realidad hay 3 límites: 247, 258 y 259.

Pero, ¿por qué tenemos un límite de 258 para archivos en la raíz de la unidad y 259 para archivos en otros directorios?

Ver también:https://www.mail-archive.com/[correo electrónico protegido]/msg106171.html

MAX_PATH, que limita las rutas de archivos a unos míseros 259 caracteres (sin el nulo final); el directorio actual a 258 caracteres (sin barra invertida al final ni nulo); y la ruta de un nuevo directorio a 247 caracteres (resta 12 de 259 para dejar espacio para un nombre de archivo 8.3).

Sin embargo, la segunda cita no tiene sentido para mí. No puedo entender por qué este tipo habla de una barra invertida al final. La barra invertida al final puede ser un caso cuando hablamos de directorios, ¡pero no de archivos!

Respuesta1

Tengo una explicación simple para la diferencia: código incorrecto en Windows 7, reescrito de nuevo en Windows 10. A continuación mostraré por qué creo eso y cuáles son las reglas sobre la longitud de los nombres de archivos tanto en Windows 7 como en 10.

Pero primero, un pequeño comentario: el límite de 260 de MAX_PATH es un artefacto de una versión de Windows mucho anterior. No se puede cambiar porque la API de Windows lo utiliza mucho en sus estructuras de datos, por ejemplo en WIN32_FIND_DATA, de modo que aumentarlo en la API provocaría una saturación de memoria en las aplicaciones existentes. Es por eso que los nombres de archivos más largos deben permitirse explícitamente en el registro y un programa necesita declarar su capacidad para manejar nombres largos en su manifiesto.

También observo que la letra de unidad ( C:\) solo se incluye en el texto y no se relaciona con las tablas de discos de Windows (MFT). Windows sabe bien en qué disco reside el archivo.

A continuación se muestran mis pruebas en Windows 7, donde mis hallazgos corroboran los del cartel:

ingrese la descripción de la imagen aquí

Se pueden derivar las siguientes reglas:

  • La letra de Drive no entra en los cálculos de límites ( C:)
  • La barra invertida inicial no entra en los cálculos de límites ( C:\)
  • El resto está limitado a 256 caracteres, lo que incluye barras invertidas intermedias.
  • Un archivo raíz puede tener hasta 255 caracteres, algo que los archivos en carpetas no pueden hacer.

Estos resultados sin sentido apuntan fuertemente en la dirección de un código mal escrito.

Para empezar, en lo que respecta a MFT, cada componente de ruta está separado y tiene exactamente los mismos límites de longitud que cualquier otro componente (subcarpeta), por lo que no hay ninguna razón inherente a las tablas de disco para limitar la longitud. de nombres de archivos solo porque están incluidos en alguna carpeta.

En segundo lugar, tenemos la pregunta de por qué un archivo raíz está limitado a 255 caracteres, cuando parece que debería tener 256, ya que es el único elemento en su ruta (que vimos que puede alcanzar los 256 caracteres).

En la búsqueda de una explicación, teoricé que 255 es el límite real para los nombres de archivos decidido por Microsoft, y que el resto es en realidad sólo código mal escrito.

Para verificar esta teoría, probé para ver el comportamiento de Windows 10. He repetido a continuación las mismas operaciones (se necesitan permisos de administrador para escribir C:\):

ingrese la descripción de la imagen aquí

Como se vio arriba, el comportamiento aquí es mucho más lógico: los componentes intermedios de la ruta ya no cuentan para limitar el tamaño del nombre del archivo, que siempre es de 255 caracteres.

Quedó claro que la intención de Microsoft desde el principio era permitir nombres de archivos de 255 caracteres, pero esto se deshabilitó en Windows 7 mediante un código que tenía en cuenta la ruta, y sin ninguna buena razón.

Una investigación más profunda descubrió la documentación para NTFS. Atributo: $FILE_NAME (0x30), que especifica un byte para la longitud del nombre del archivo (en el desplazamiento 0x40). Esto explica bien el límite de 255 caracteres. (Ver también FireEye Parte 2: Las estructuras internas de un atributo de nombre de archivo).

Pequeña anécdota: Según la ley de conservación de errores de Microsoft, el Explorador de Windows 10 era incapaz de eliminar los archivos de 255 caracteres en formato C:\, C:\Tempy C:\Temp\abc. Tuve que ingresar en el símbolo del sistema el comando del 12*para deshacerme de ellos. (Corregir un error mientras se introduce otro...)

Respuesta2

Por alguna razón, los resultados son diferentes. La longitud máxima en C:\aaa y C:\aaa\bbb es de 259 caracteres, pero la longitud máxima en C:\ es de 258 caracteres. ¿Por qué?

Creo que lo que estás preguntando es cuál es la longitud máxima de una ruta que normalmente permite el Explorador de Windows. Son 260 caracteres.

Eso permite 248 caracteres para la ruta más el nombre del archivo, que permite 12 caracteres.

Los nombres de los archivos de ejemplo son diferentes debido al carácter nulo.

En ediciones de Windows anteriores a Windows 10 versión 1607, la longitud máxima de una ruta es MAX_PATH, que se define como 260 caracteres. En versiones posteriores de Windows, es necesario cambiar una clave de registro o utilizar la herramienta de Política de grupo para eliminar el límite.

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", donde "" representa el carácter nulo de terminación 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).

Fuente:

Respuesta3

Hay dos límites a considerar: uno es la longitud máxima de la ruta y el otro la longitud máxima del nombre del archivo. En NTFS,Los nombres de archivos pueden contener hasta 255 puntos de código UTF-16., sin bytes nulos (consulte la página 12).

abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txttiene exactamente 255 caracteres de longitud.

información relacionada