Tamanho máximo do nome de arquivo no NTFS (Windows XP e Windows Vista)?

261

Estou projetando uma tabela de banco de dados que conterá os nomes dos arquivos dos arquivos enviados. Qual é o tamanho máximo de um nome de arquivo no NTFS usado pelo Windows XP ou Vista?

GateKiller
fonte
83
Eu nunca vi tantas respostas diferentes para o que deveria ser uma pergunta simples. 199, 255, 256, 257, 260, "cerca de 30 000", "aproximadamente 32 000" e "depende". Claro, existem qualificadores, mas nem todos podem estar certos, podem?
MickeyfAgain_BeforeExitOfSO
7
Em 255, eu sei disso porque precisei criar um aplicativo para impedir que usuários corporativos alcancem esse problema, pois isso causa problemas em nossos servidores de armazenamento.
precisa saber é o seguinte
2
@RobertPitt. Você está perdendo alguma coisa lá. Citação do MSDN: "o comprimento máximo de um caminho é MAX_PATH, que é definido como 260 caracteres"
Michael Olesen
7
@ Michael9000. Acredito que RobertPitt estava citando o limite do nome do arquivo (que é o objetivo desta pergunta), não o limite do caminho.
Gdw2
7
NTFS não está limitada a MAX_PATH em tudo, a Shell do Windows é limitado a MAX_PATH, o NTFS comprimento do caminho máximo é 32k
paulm

Respostas:

286

Os componentes individuais de um nome de arquivo (ou seja, cada subdiretório ao longo do caminho e o nome do arquivo final) são limitados a 255 caracteres e o comprimento total do caminho é limitado a aproximadamente 32.000 caracteres.

No entanto, no Windows, você não pode exceder o MAX_PATHvalor (259 caracteres para arquivos, 248 para pastas). Vejohttp://msdn.microsoft.com/en-us/library/aa365247.aspx para obter detalhes completos.

Adam Rosenfield
fonte
4
Aqui estão mais alguns fatos que confirmam esta resposta (o Windows normalmente está limitado a 260 caracteres): msdn.microsoft.com/en-us/library/… e blogs.msdn.com/b/bclteam/archive/2007/02/13 / ...
Michael Olesen
62
Correto para NTFS, não correto para Windows, de acordo com o link que você forneceu: "Na API do Windows (com algumas exceções discutidas nos parágrafos a seguir), o comprimento máximo de um caminho é MAX_PATH, definido como 260 caracteres". O caminho total é, para todos os efeitos práticos, limitado a 259 caracteres (permitindo o terminador nulo).
Lawrence Dol
9
Aparentemente, se você usar a "versão unicode" dos métodos de arquivo da API do Windows, poderá obter 32767 se prefixar os nomes de caminho com "\\? \", Está correto?
Rogerdpack
6
@rogerdpack: para o caminho completo, sim, mas cada componente individual (subpasta / arquivo final) tem um limite de 255 pontos de código utf-16. Além disso, o software normal de esperar MAX_PATH, então ... boom de :)
snemarch
5
No Windows 10 (Versão 1607 - Atualização de aniversário) e no Windows Server 2016, você tem a opção de ignorar o problema MAX_PATH, substituindo uma entrada de diretiva de grupo para ativar os caminhos longos do NTFS em Configuração do computador -> Modelos de administração -> Sistema -> Sistema de arquivos:
Steven Mark Ford
28

São 257 caracteres. Para ser mais preciso: o próprio NTFS impõe um tamanho máximo de nome de arquivo de vários milhares de caracteres (cerca de 30.000). No entanto, o Windows impõe um comprimento máximo de 260 para o Path + Filename. A pasta drive + ocupa pelo menos 3 caracteres, então você termina com 257.

Alphager
fonte
21
Errado - o terminador NUL faz parte de MAX_PATH, que deixa um caminho máximo de 256 caracteres (que você não poderá criar devido ao limite de 255 de componentes individuais).
Snemarch 02/10/12
4
"que você não poderá criar devido ao limite de componentes individuais de 255" Errado. Estamos falando aqui sobre o comprimento máximo do caminho, não o comprimento máximo dos componentes individuais do caminho. Além disso "Ao usar uma API para criar um diretório, o caminho especificado não pode ser tão longo que você não pode acrescentar um nome de arquivo 8.3 (ou seja, o nome do diretório não pode exceder MAX_PATH menos 12)."
Ludovic Kuty
Esse debate ocorre apenas porque a API de baixo nível permite a criação de nomes de arquivos 256 caracteres, supondo que o caractere 256 seja nulo, mas o arquivo se torna inacessível (oculto) para aplicativos nativos, portanto, geralmente não é útil.
Conrad B
1
@LudovicKuty: na verdade, o OP estava falando sobre a limitação do tamanho do nome do arquivo , não do tamanho do caminho (sim, mesmo na revisão original, verifiquei). E ele estava se referindo muito especificamente aos limites de NTFS e não aos limites do sistema operacional, de um subsistema ou API ou estrutura específica.
0xC0000022L
@ 0xC0000022L Sim, de fato. Eu o interpretei errado na pergunta do OP e foquei nos comentários que falam sobre o comprimento do nome do arquivo e o tamanho do caminho.
Ludovic Kuty
27

É o que a "Exceção não tratada" diz na estrutura 4.5 ao tentar salvar um arquivo com um nome de arquivo longo:

O caminho especificado, o nome do arquivo ou ambos são muito longos. O nome completo do arquivo deve ter menos de 260 caracteres e o nome do diretório deve ter menos de 248 caracteres.

captura de tela

SturmCoder
fonte
16

199 no Windows XP NTFS, acabei de verificar.

Isso não é teoria, mas apenas tentando no meu laptop. Pode haver efeitos atenuantes, mas fisicamente não vai me deixar aumentar.

Existe alguma outra configuração limitando isso, eu me pergunto? Experimente você mesmo.

pomba
fonte
1
Confirmou isso na minha versão do XP, o que é uma dor
Julian Jovem
Eu fiz exatamente o mesmo em um Windows XP apenas para rir. Eu atingi um limite de 200 caracteres. Depois, criei um arquivo 255 vezes w, excluí-o e criei uma pasta com o mesmo nome no Windows 7 x64. Agora, a pergunta é qual é o fator limitante aqui: a versão NTFS, o sistema operacional ou o subsistema ou a API Win32 no XP?
0xC0000022L
O limite de 200 caracteres parece estar no explorer. Outros programas podem criar nomes de arquivos mais longos. Provavelmente, esse é um limite intencional para salvar o usuário de si mesmo. :-)
avl_sweden 28/02
13

De acordo com o MSDN , são 260 caracteres. Ele inclui o "<NUL>"caractere nulo final invisível, portanto o comprimento real é 259.

Mas leia o artigo, é um pouco mais complicado.

Kibbee
fonte
1
Na verdade, o artigo do MSDN mencionado diz que o caminho é limitado a 260 caracteres, mas o comprimento do nome do arquivo depende do sistema de arquivos (mas geralmente 255 bytes). No entanto, é possível usar "Versões Unicode [das funções da API do Windows]" para aumentar o limite do caminho para 32767 bytes, mas esse limite é reduzido pela expansão interna do Windows do \\?\ prefixo necessário no tempo de execução para um comprimento não especificado. O caminho deve permanecer abaixo de 32767 bytes após essa expansão.
Mikko Rantalainen 28/02
13

O comprimento no NTFS é 255. O NameLengthcampo no $Filenameatributo NTFS é um byte sem deslocamento; isso gera um intervalo de 0 a 255.

O próprio nome do arquivo pode estar em diferentes "namespaces". Até o momento, existem: POSIX, WIN32, DOS e (WIN32DOS - quando um nome de arquivo pode ser nativamente um nome de DOS). (Como a cadeia tem um comprimento, ela pode conter \ 0, mas isso traria problemas e não está nos espaços para nome acima.)

Assim, o nome de um arquivo ou diretório pode ter até 255 caracteres. Ao especificar o caminho completo no Windows, você precisa prefixar o caminho com \\? \ (Ou usar \\? \ UNC \ server \ share para caminhos UNC) para marcar esse caminho como um comprimento estendido (~ 32k caracteres) . Se o seu caminho for mais longo, você terá que definir seu diretório de trabalho ao longo do caminho (ugh - efeitos colaterais devido à configuração do processo).

Dominik Weber
fonte
4

Estou adicionando isso à resposta aprovada acima.

PARA SER CLARO, a razão pela qual as pessoas acreditam que sejam 255-260 caracteres é porque isso é tudo o que o Windows Explorer suporta. Será um erro fazer algo como uma cópia de arquivo em nomes de arquivos mais longos do que isso. No entanto, um programa pode ler e gravar nomes de arquivos muito mais longos (que é a maneira pela qual você obtém informações que o Explorer reclama em primeiro lugar). A "correção recomendada" da Microsoft em situações como essa é abrir o arquivo no programa original que o escreveu e renomeá-lo.

std''OrgnlDave
fonte
Tentei salvar um arquivo no fundo de uma hierarquia de pastas que definitivamente excede mais de 260 caracteres da linha de comando com o vim, mas não teve êxito.
panny
@panny: então os autores do Vim não tiveram o cuidado de implementar nomes de caminhos longos na época. A culpa não é do Windows, nem do subsistema Win32, nem tem nada a ver com a limitação de tamanho de nome de arquivo para NTFS sobre o qual o OP perguntou.
0XC0000022L
3

De acordo com a nova documentação do Windows SDK (8.0), parece que um novo limite de caminho é fornecido. Há um novo conjunto de funções de manipulação de caminho e uma definição de PATHCCH_MAX_CCH da seguinte maneira:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000
Cplusminus_is_coming
fonte
3
No entanto, o Windows 8 Explorer (Win8.1 Preview no meu caso) não está funcionando com esse limite e não aceita caminhos com mais de 259 caracteres.
Cplusminus_is_coming
3

Esta parte da documentação oficial diz claramente que são 255 caracteres Unicode para NTFS, exFAT e FAT32 e 127 caracteres Unicode ou 254 caracteres ASCII para UDF.

Além disso, o comprimento máximo do nome do caminho é sempre 32.760 caracteres Unicode, com cada componente do caminho com no máximo 255 caracteres.

caw
fonte
Perto o suficiente. Como aponto em um comentário sobre a resposta aceita, são 32767 WCHARelementos. Não, não são "caracteres Unicode" (verifique sua terminologia Unicode: pontos de código, caracteres etc ...!).
0xC0000022L
-2

238! Eu verifiquei no Win7 32 bits com o seguinte script bat:

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
fonte
Eu verifiquei no Windows 7 com um programa que lida com caminhos longos corretamente. Cada segmento de caminho individual pode ter 255 caracteres (eu usei w). E agora?
0xC0000022L
-2

Na verdade, é 256, consulte Comparação de funcionalidades do sistema de arquivos, Limites .

Para repetir uma postagem em http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

"Supondo que estamos falando de NTFS e não de FAT32, os" 255 caracteres para o caminho + arquivo "são uma limitação do Explorer, não do próprio sistema de arquivos. O NTFS suporta caminhos com até 32.000 caracteres Unicode, com cada componente com 255 caracteres.

O Explorer - e a API do Windows - limita você a 260 caracteres para o caminho, que incluem letra da unidade, dois pontos, barras e um caractere nulo final. É possível ler um caminho mais longo no Windows se você o iniciar com um\\ "

Se você ler as postagens acima, verá uma quinta coisa de que pode ter certeza: Encontrar pelo menos um usuário obstinado de computador!

fane
fonte
4
Não - é 255. O campo NameLength no atributo NTFS $ Filename é um byte sem deslocamento; isto produz uma gama de 0-255
Dominik Weber
-2

Não consigo criar um arquivo com o nome + ponto + extnião no WS 2012 Explorer com mais de 224 caracteres. Não atire no mensageiro!

No CMD do mesmo servidor, não consigo criar um nome com mais de 235 caracteres:

O sistema não consegue encontrar o caminho especificado.

O arquivo com um nome de 224 caracteres criado no Explorer não pode ser aberto no Notepad ++ - ele apenas cria um novo arquivo.

ajeh
fonte
The system cannot find the path specified.não é o mesmo que The specified path, file name, or both are too long.. Eu acho que você teve um erro de digitação ou algo assim. Você recebe essa mensagem se tentar criar um arquivo em um caminho que não existe ou se desejar mover para uma direção que não existe.
Matthias Burger