Embora o NTFS permita caminhos com cerca de 32.000 caracteres, você encontrou o comprimento do caminho de 259 caracteres limitação da API do Win32 .
In the Windows API (with some exceptions discussed in the [linked document]), the maximum length for a path is
MAX_PATH
, which is defined as 260 characters.
(Há adicionalmente um caractere de terminação NULL
anexado ao caminho, dando-nos 259 caracteres utilizáveis.)
Como o Explorer (e quase todos os outros aplicativos do Windows) contam com a API do Win32 para acesso ao sistema de arquivos, não é prático contornar essa limitação, embora seja possível :
The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters. This type of path is composed of components separated by backslashes, each up to the value returned in the
lpMaximumComponentLength
parameter of theGetVolumeInformation
function (this value is commonly 255 characters). To specify an extended-length path, use the "\?\" prefix. For example, "\?\D:\very long path".
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 lidar com nomes de caminho muito longos.
Uma maneira de acessar caminhos de comprimento estendido no Windows é instalar o Cygwin , uma camada de emulação * nix para Windows. Nos meus testes, o Cygwin não parece estar limitado por MAX_PATH
; bash e vi não tiveram problemas com caminhos de 2.000 caracteres.
Lembre-se de que, mesmo que você possa usar o bash para procurar caminhos de comprimento estendido, provavelmente não conseguirá abrir arquivos nesses caminhos em aplicativos normais do Windows. Por exemplo, digitar notepad
enquanto o diretório de trabalho é um caminho de comprimento estendido leva você
Error: Current working directory has a path longer than allowed for a Win32 working directory. Can't start native Windows application from here.
E tentar notepad "\?\D:\very long path\file.txt"
também não funciona; lança, mas apenas diz
"Não é possível encontrar o arquivo ..." Tentando o mesmo com O Notepad ++ trava. (Provavelmente um estouro de buffer.)
Sua outra opção para acessar arquivos específicos enterrados em um caminho de extensão estendida é encurtar o caminho em si criando um NTFS ponto de junção . De um prompt de comando elevado:
D:\> mklink /J jct "\?\D:\very\long\path"
Agora você pode acessar o conteúdo de D:\very\long\path\
de D:\jct\
. Você não atingirá nenhum problema de comprimento de caminho porque, no que diz respeito ao Explorer e outros aplicativos, o caminho é apenas D:\jct\
(ou qualquer outro). O driver NTFS manipula 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 a caracteres especiais ( " * : < > ? \ |
), isso é simplesmente um não-uso. Esses caracteres têm significados especiais no Windows, por isso não é possível usá-los nos caminhos. (O Cygwin permite que você crie arquivos com caracteres especiais, mas o faz por substituindo os caracteres com caracteres Unicode especiais, que serão substituídos novamente durante a leitura. A visualização desses arquivos criados pelo Cygwin no Linux ou no Explorer não parecerá correta, já que os caracteres Unicode não serão substituídos novamente.
Tudo isso dito, o que você está fazendo que requer caminhos muito longos? Talvez você possa tornar sua vida mais fácil reavaliando o que está fazendo e evitando longos caminhos. Provavelmente, você não precisa de caminhos longos .