¿Longitud máxima del nombre de archivo en NTFS (Windows XP y Windows Vista)?

261

Estoy diseñando una tabla de base de datos que contendrá los nombres de los archivos cargados. ¿Cuál es la longitud máxima de un nombre de archivo en NTFS como lo usa Windows XP o Vista?

GateKiller
fuente
83
Nunca he visto tantas respuestas diferentes a lo que debería ser una pregunta simple. 199, 255, 256, 257, 260, 'aproximadamente 30 000', 'aproximadamente 32 000' y 'depende'. Claro, hay calificadores, pero estos no pueden ser correctos, ¿verdad?
MickeyfAgain_BeforeExitOfSO
77
es 255, lo sé porque tuve que crear una aplicación para evitar que los usuarios corporativos lleguen a esto, ya que causa problemas en nuestros servidores de almacenamiento.
RobertPitt
2
@RobertPitt. Te estás perdiendo algo allí. Cita de MSDN: "la longitud máxima de una ruta es MAX_PATH, que se define como 260 caracteres"
Michael Olesen
77
@ Michael9000. Creo que RobertPitt estaba citando el límite de nombre de archivo (que es de lo que trata esta pregunta), no el límite de ruta.
gdw2
77
NTFS NO está limitado a MAX_PATH en absoluto, el Shell de Windows está limitado a MAX_PATH, la longitud de ruta máxima de NTFS es de 32k
paulm

Respuestas:

286

Los componentes individuales de un nombre de archivo (es decir, cada subdirectorio a lo largo de la ruta y el nombre de archivo final) están limitados a 255 caracteres, y la longitud total de la ruta está limitada a aproximadamente 32,000 caracteres.

Sin embargo, en Windows, no puede exceder el MAX_PATHvalor (259 caracteres para archivos, 248 para carpetas). Verhttp://msdn.microsoft.com/en-us/library/aa365247.aspx para más detalles.

Adam Rosenfield
fuente
44
Aquí hay más datos que confirman esta respuesta (Windows normalmente está limitado a 260 caracteres): msdn.microsoft.com/en-us/library/… y blogs.msdn.com/b/bclteam/archive/2007/02/13 / ...
Michael Olesen
62
Correcto para NTFS, no correcto para Windows, de acuerdo con el enlace que proporcionó: "En la API de Windows (con algunas excepciones discutidas en los siguientes párrafos), la longitud máxima para una ruta es MAX_PATH, que se define como 260 caracteres". La ruta total está, a todos los efectos prácticos, limitada a 259 caracteres (permitiendo el terminador nulo).
Lawrence Dol
9
Aparentemente, si usa la "versión unicode" de los métodos de archivo de API de Windows, puede obtener hasta 32767 si prefija los nombres de ruta con "\\? \", ¿Verdad?
rogerdpack
66
@rogerdpack: para la ruta completa, sí, pero cada componente individual (subcarpeta / archivo final) tiene un límite de 255 puntos de código utf-16. Además, el software normal espera MAX_PATH, así que ... boom :)
snemarch
55
En Windows 10 (Versión 1607 - Actualización de aniversario) y Windows Server 2016, parece tener una opción para ignorar el problema de MAX_PATH al anular una entrada de política de grupo para habilitar las rutas largas NTFS en Configuración del equipo -> Plantillas de administrador -> Sistema -> Sistema de archivos:
Steven Mark Ford
28

Son 257 caracteres. Para ser precisos: NTFS sí impone una longitud máxima de nombre de archivo de varios miles de caracteres (alrededor de 30'000 algo). Sin embargo, Windows impone una longitud máxima de 260 para Path + Filename. La carpeta drive + ocupa al menos 3 caracteres, por lo que terminas con 257.

Alphager
fuente
21
Incorrecto: el terminador NUL es parte de MAX_PATH, lo que te deja con una ruta máxima de 256 caracteres (que no podrás crear debido al límite de componentes individuales de 255).
snemarch
44
"que no podrá crear debido al límite de componentes individuales de 255" Incorrecto. Estamos hablando aquí sobre la longitud máxima de la ruta, no la longitud máxima de los componentes de la ruta individual. Además, "cuando se utiliza una API para crear un directorio, la ruta especificada no puede ser tan larga que no se puede agregar un nombre de archivo 8.3 (es decir, el nombre del directorio no puede exceder MAX_PATH menos 12)".
Ludovic Kuty
Este debate solo llega porque la API de bajo nivel permite la creación de nombres de archivo de 256 caracteres, en el supuesto de que el 256 caracteres es nulo, pero el archivo se vuelve inaccesible (oculto) para las aplicaciones nativas, por lo que generalmente no es útil.
Conrad B
1
@LudovicKuty: en realidad, el OP estaba hablando de la limitación de la longitud del nombre del archivo , no de la longitud de la ruta (sí, incluso en la revisión original, verifiqué). Y se refería muy específicamente a los límites de NTFS y no a los límites del sistema operativo, un subsistema o API o marco en particular.
0xC0000022L
@ 0xC0000022L Sí, de hecho. Lo leí mal en la pregunta OP y me concentré en los comentarios que hablan sobre la longitud del nombre de archivo y la longitud de la ruta.
Ludovic Kuty
27

Esto es lo que dice la "excepción no controlada" en el marco 4.5 al intentar guardar un archivo con un nombre de archivo largo:

La ruta especificada, el nombre del archivo o ambos son demasiado largos. El nombre de archivo completo debe tener menos de 260 caracteres y el nombre del directorio debe tener menos de 248 caracteres.

captura de pantalla

SturmCoder
fuente
16

199 en Windows XP NTFS, acabo de comprobar.

Esto no es teoría, sino simplemente probarlo en mi computadora portátil. Puede haber efectos atenuantes, pero físicamente no me deja agrandarlo.

¿Hay alguna otra configuración que limite esto, me pregunto? Pruébalo por ti mismo.

paloma
fuente
1
Confirmado esto en mi versión de XP, qué dolor
Julian Young
Hice exactamente lo mismo en un Windows XP solo por risas. Llegué a un límite de 200 caracteres. Luego, acabo de crear un archivo 255 veces w, lo eliminé y creé una carpeta con el mismo nombre en Windows 7 x64. Ahora la pregunta es cuál es el factor limitante aquí: la versión NTFS, el sistema operativo o el subsistema o la API Win32 en XP.
0xC0000022L
El límite de 200 caracteres parece estar en el explorador. Otros programas pueden crear nombres de archivo más largos. Este es probablemente un límite intencional para salvar al usuario de sí mismo. :-)
avl_sweden
13

Según MSDN , tiene 260 caracteres. Incluye "<NUL>"el carácter nulo de terminación invisible, por lo que la longitud real es 259.

Pero lea el artículo, es un poco más complicado.

Kibbee
fuente
1
En realidad, el artículo de MSDN al que se hace referencia dice que la ruta está limitada a 260 caracteres pero la longitud del nombre de archivo depende del sistema de archivos (pero comúnmente 255 bytes). Sin embargo, es posible usar "versiones Unicode [de las funciones de la API de Windows]" para elevar el límite de ruta a 32767 bytes, pero ese límite se reduce mediante ventanas que expanden internamente el \\?\ prefijo requerido en el tiempo de ejecución a una longitud no especificada. La ruta debe permanecer por debajo de 32767 bytes después de esta expansión.
Mikko Rantalainen
13

La longitud en NTFS es 255. El NameLengthcampo en el $Filenameatributo NTFS es un byte sin desplazamiento; esto produce un rango de 0-255.

El nombre del archivo puede estar en diferentes "espacios de nombres". Hasta ahora hay: POSIX, WIN32, DOS y (WIN32DOS, cuando un nombre de archivo puede ser de forma nativa un nombre de DOS). (Dado que la cadena tiene una longitud, podría contener \ 0 pero eso generaría problemas y no está en los espacios de nombres anteriores).

Por lo tanto, el nombre de un archivo o directorio puede tener hasta 255 caracteres. Al especificar la ruta completa en Windows, debe prefijar la ruta con \\? \ (O usar \\? \ UNC \ server \ share para rutas UNC) para marcar esta ruta como una de longitud extendida (~ 32k caracteres) . Si su ruta es más larga, tendrá que configurar su directorio de trabajo en el camino (ugh - efectos secundarios debido a la configuración de todo el proceso).

Dominik Weber
fuente
4

Estoy agregando esto a la respuesta aprobada anterior.

PARA SER CLARO, la razón por la que la gente cree que tiene 255-260 caracteres es porque eso es todo lo que Windows Explorer admite. Se producirá un error al hacer algo como una copia de archivo en nombres de archivo más largos que eso. Sin embargo, un programa puede leer y escribir nombres de archivo mucho más largos (que es así como llega a longitudes de las que Explorer se queja en primer lugar). La "solución recomendada" de Microsoft en situaciones como esta es abrir el archivo en el programa original que lo escribió y cambiarle el nombre.

std''OrgnlDave
fuente
Traté de guardar un archivo en el fondo de una jerarquía de carpetas que definitivamente superaba los 260 caracteres de la línea de comandos con vim, pero no tuve éxito.
panny
@panny: por lo tanto, los autores de Vim no se han preocupado por implementar nombres de ruta largos. No es culpa de Windows ni del subsistema Win32 ni tiene nada que ver con la limitación de la longitud del nombre de archivo para NTFS sobre la que el OP preguntó.
0xC0000022L
3

Según la nueva documentación del SDK de Windows (8.0) parece que se proporciona un nuevo límite de ruta. Hay un nuevo conjunto de funciones de manejo de ruta y una definición de PATHCCH_MAX_CCH como la siguiente:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000
Cplusminus_is_coming
fuente
3
Sin embargo, el explorador de Windows 8 (Win8.1 Preview en mi caso) no funciona con este límite y no aceptará rutas de más de 259 caracteres.
Cplusminus_is_coming
3

Esta parte de la documentación oficial dice claramente que son 255 caracteres Unicode para NTFS, exFAT y FAT32, y 127 caracteres Unicode o 254 caracteres ASCII para UDF.

Aparte de eso, la longitud máxima del nombre de ruta es siempre de 32.760 caracteres Unicode, con cada componente de ruta no más de 255 caracteres.

graznar
fuente
Suficientemente cerca. Como señalo en un comentario sobre la respuesta aceptada, son 32767 WCHARelementos. No, no son "caracteres Unicode" (verifique su terminología Unicode: puntos de código, caracteres, etc.).
0xC0000022L
-2

238! Lo comprobé en Win7 de 32 bits con el siguiente script de murciélago:

set "fname="
for /l %%i in (1, 1, 27) do @call :setname
@echo %fname%
for /l %%i in (1, 1, 100) do @call :check
goto :EOF
:setname
set "fname=%fname%_123456789"
goto :EOF
:check
set "fname=%fname:~0,-1%"
@echo xx>%fname%
if not exist %fname% goto :eof
dir /b
pause
goto :EOF
SzB
fuente
Lo comprobé en Windows 7 con un programa que maneja rutas largas correctamente. Cada segmento de ruta individual podría ocupar 255 caracteres (solía w). ¿Y ahora qué?
0xC0000022L
-2

En realidad es 256, ver Comparación de funcionalidades del sistema de archivos, límites .

Para repetir una publicación en http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

"Suponiendo que estamos hablando de NTFS y no de FAT32, los" 255 caracteres para ruta + archivo "son una limitación de Explorer, no del sistema de archivos en sí. NTFS admite rutas de hasta 32,000 caracteres Unicode de largo, con cada componente de hasta 255 caracteres.

Explorer, y la API de Windows, lo limitan a 260 caracteres para la ruta, que incluyen letra de unidad, dos puntos, barras inclinadas y un carácter nulo final. Es posible leer una ruta más larga en Windows si la inicia con un \\"

Si lees las publicaciones anteriores, verás que hay una quinta cosa de la que puedes estar seguro: ¡Encontrar al menos un usuario obstinado de la computadora!

fane
fuente
44
No, es 255. El campo NameLength en el atributo NTFS $ Filename es un byte sin desplazamiento; esto produce un rango de 0-255
Dominik Weber
-2

No puedo crear un archivo con el nombre + período + extensión en WS 2012 Explorer de más de 224 caracteres. ¡No le dispares al mensajero!

En el CMD del mismo servidor no puedo crear un nombre de más de 235 caracteres:

El sistema no puede encontrar la ruta especificada.

El archivo con un nombre de 224 caracteres creado en el Explorador no se puede abrir en Notepad ++; en su lugar, solo aparece un nuevo archivo.

ajeh
fuente
The system cannot find the path specified.No es lo mismo que The specified path, file name, or both are too long.. Supongo que tenías un error tipográfico o algo así. Obtiene ese mensaje si intenta crear un archivo en una ruta que no existe o si desea moverse a una dirección que no existe.
Matthias Burger