Enquanto o NTFS permite caminhos com cerca de 32.000 caracteres, você encontrou a limitação de comprimento do caminho de 259 caracteres da API do Win32 .
Na API do Windows (com algumas exceções discutidas no [documento vinculado]), o comprimento máximo de um caminho MAX_PATH
é definido como 260 caracteres.
(Além disso, há um NULL
caractere de terminação anexado ao caminho, fornecendo 259 caracteres utilizáveis.)
Como o Explorer (e quase todos os outros aplicativos do Windows) confia na API do Win32 para acessar o sistema de arquivos, não é prático contornar essa limitação, mesmo que seja possível :
A API do Windows possui muitas funções que também possuem versões Unicode para permitir um caminho de tamanho estendido para um comprimento total máximo de 32.767 caracteres. Esse tipo de caminho é composto de componentes separados por barras invertidas, cada um até o valor retornado no lpMaximumComponentLength
parâmetro da GetVolumeInformation
função (esse valor geralmente possui 255 caracteres). Para especificar um caminho de tamanho estendido, use o prefixo "\\? \". Por exemplo, "\\? \ D: \ caminho muito longo ".
Infelizmente, você não pode simplesmente digitar \\?\D:\very long path
em uma janela do Explorer. O aplicativo deve ser projetado para aproveitar essas APIs e manipular nomes de caminhos muito longos.
Uma maneira de acessar caminhos de tamanho estendido no Windows é instalar o Cygwin , uma camada de emulação * nix para Windows. Nos meus testes, Cygwin não parece ser limitado por MAX_PATH
; bash e vi não tiveram problemas com caminhos de 2.000 caracteres.
Lembre-se de que, embora você possa usar o bash para procurar caminhos de tamanho estendido, provavelmente não poderá abrir arquivos nesses caminhos em aplicativos comuns do Windows. Por exemplo, digitar notepad
enquanto o diretório de trabalho é um caminho de tamanho estendido leva você
Erro: O diretório de trabalho atual possui um caminho maior que o permitido para um diretório de trabalho do Win32. Não é possível iniciar o aplicativo nativo do Windows a partir daqui.
E tentar notepad "\\?\D:\very long path\file.txt"
também não funciona; é iniciado, mas diz apenas "Não é possível encontrar o arquivo ..." Tentar o mesmo com o Notepad ++ trava. (Provavelmente um estouro de buffer.)
Sua outra opção para acessar arquivos específicos ocultos em um caminho de tamanho estendido é encurtar o próprio caminho criando um ponto de junção NTFS . Em um prompt de comando elevado:
D:\> mklink /J jct "\\?\D:\very\long\path"
Agora você pode acessar o conteúdo D:\very\long\path\
de D:\jct\
. Você não encontrará nenhum problema no tamanho do caminho, porque, no que diz respeito ao Explorer e a outros aplicativos, o caminho é justo D:\jct\
(ou o que seja). O driver NTFS lida com o redirecionamento do caminho (o "ponto de nova análise") de forma transparente.
A desvantagem dessa abordagem é obviamente que você precisa criar uma junção próxima ao arquivo que deseja acessar; você ainda não pode simplesmente navegar por toda a estrutura de diretórios.
Em relação aos caracteres especiais ( " * : < > ? \ |
), isso é simplesmente inútil. Esses caracteres têm significados especiais no Windows, portanto, não é possível usá-los nos caminhos. (O Cygwin permite que você crie arquivos com caracteres especiais, mas o faz substituindo os caracteres por caracteres Unicode especiais, que são substituídos novamente ao ler. Visualizar esses arquivos criados pelo Cygwin no Linux ou no Explorer não pareceria correto, pois os caracteres Unicode não seriam substituídos novamente.)
Tudo isso dito, o que você está fazendo que requer caminhos muito longos? Talvez você possa facilitar sua vida reavaliando o que está fazendo e evitando longos caminhos. As chances são de que você não precise de caminhos tão longos assim .