Eu já enfrentei esse problema algumas vezes em momentos inoportunos:
- Tentando trabalhar em projetos Java de código aberto com caminhos profundos
- Armazenando árvores wiki profundas do Fitnesse no controle de origem
- Erro ao tentar usar o Bazaar para importar minha árvore de controle de origem
Por que esse limite existe?
Por que ainda não foi removido?
Como você lida com o limite de caminho? E não, mudar para Linux ou Mac OS X não é uma resposta válida para esta pergunta;)
Respostas:
Citando este artigo https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Agora vemos que é 1 + 2 + 256 + 1 ou [drive] [: \] [path] [null] = 260. Pode-se supor que 256 seja um comprimento de cadeia fixo razoável dos dias do DOS. E voltando às APIs do DOS, percebemos que o sistema rastreava o caminho atual por unidade e temos 26 (32 com símbolos) unidades máximas (e diretórios atuais).
O INT 0x21 AH = 0x47 diz "Esta função retorna a descrição do caminho sem a letra da unidade e a barra invertida inicial". Portanto, vemos que o sistema armazena o CWD como um par (unidade, caminho) e você solicita o caminho especificando a unidade (1 = A, 2 = B,…); se você especificar um 0, assumirá o caminho para a unidade retornada por INT 0x21 AH = 0x15 AL = 0x19. Então agora sabemos por que é 260 e não 256, porque esses 4 bytes não são armazenados na cadeia de caminho.
Por que uma string de caminho de 256 bytes, porque 640K é RAM suficiente.
fonte
Isso não é rigorosamente verdadeiro, pois o sistema de arquivos NTFS suporta caminhos com até 32k caracteres. Você pode usar a API win32 e "
\\?\
" prefixar o caminho para usar mais de 260 caracteres.Uma explicação detalhada do caminho longo no blog da equipe .Net BCL .
Um pequeno trecho destaca a questão com caminhos longos
fonte
A questão é por que a limitação ainda existe. Certamente o Windows moderno pode aumentar o lado
MAX_PATH
para permitir caminhos mais longos. Por que a limitação não foi removida?Através do contrato de API, o Windows garantiu a todos os aplicativos que as APIs de arquivo padrão nunca retornarão um caminho mais longo que os
260
caracteres.Considere o seguinte código correto :
O Windows garantiu ao meu programa que ele preencheria minha
WIN32_FIND_DATA
estrutura:Meu aplicativo não declarou o valor da constante
MAX_PATH
, a API do Windows fez. Meu aplicativo usou esse valor definido.Minha estrutura está definida corretamente e aloca apenas o
592
total de bytes. Isso significa que eu só consigo receber um nome de arquivo com menos de260
caracteres. O Windows me prometeu que, se eu escrevesse meu aplicativo corretamente, ele continuaria funcionando no futuro.Se o Windows permitir nomes de arquivos com mais de
260
caracteres, meu aplicativo existente (que usou a API correta corretamente) falhará.Para quem pede que a Microsoft altere a
MAX_PATH
constante, primeiro é necessário garantir que nenhum aplicativo existente falhe. Por exemplo, eu ainda possuo e uso um aplicativo do Windows que foi escrito para ser executado no Windows 3.11. Ele ainda roda no Windows 10. de 64 bits. É isso que a compatibilidade com versões anteriores oferece.Microsoft fez criar uma maneira de usar o total de 32.768 nomes de caminho; mas eles tiveram que criar um novo contrato de API para fazer isso. Por um lado, você deve usar a API do Shell para enumerar arquivos (como nem todos os arquivos existem em um disco rígido ou em um compartilhamento de rede).
Mas eles também precisam não quebrar os aplicativos de usuário existentes. A grande maioria dos aplicativos não usa a API do shell para o trabalho do arquivo. Todo mundo simplesmente liga
FindFirstFile
/FindNextFile
e liga por dia.fonte
No Windows 10. você pode remover a limitação modificando uma chave do Registro.
fonte
Você pode montar uma pasta como uma unidade. Na linha de comando, se você tiver um caminho,
C:\path\to\long\folder
poderá mapeá-lo para a letra da unidadeX:
usando:fonte
subst
é local-session / account - consulte superuser.com/questions/29072/… para saber como torná-lo 'amplo do sistema' #Uma maneira de lidar com o limite do caminho é encurtar as entradas do caminho com links simbólicos.
Por exemplo:
C:\p
diretório para manter links curtos para caminhos longosmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
ao seu caminho em vez do caminho longofonte
/j
opção cria um ponto de montagem de junção para um dispositivo de volume local ou um caminho em um volume local (como uma montagem de ligação Unix). Não cria um link simbólico. É uma distinção importante, pois os pontos de montagem de junção são sempre avaliados em um servidor e devem direcionar dispositivos locais, enquanto os links simbólicos são avaliados no cliente e podem direcionar caminhos remotos (se permitido pela política). Como uma unidade subst.exe (ou sejaDefineDosDeviceW
), um destino de junção geralmente é limitado a cerca de 4 caracteres K. Na verdade, são 8K caracteres, divididos igualmente entre o caminho substituto e o caminho de exibição.Você pode habilitar nomes de caminhos longos usando o PowerShell:
Outra versão é usar uma Diretiva de Grupo em
Computer Configuration
/Administrative Templates
/System
/Filesystem
:fonte
Por que isso ainda existe - a MS não considera prioritária e valoriza a compatibilidade com versões anteriores do avanço do sistema operacional (pelo menos nesse caso).
Uma solução alternativa que eu uso é usar os "nomes abreviados" para os diretórios no caminho, em vez de suas versões padrão legíveis por humanos. Então, por exemplo, para
C:\Program Files\
eu usarC:\PROGRA~1\
Você pode encontrar o nome abreviado equivalentedir /x
.fonte
PATH
e passe paraSearchPathW
. Também é eficiente, uma vez que a biblioteca de tempo de execução cria "\\? \" Caminhos de dispositivo para o NT de qualquer maneira. Quanto aos sistemas de arquivos mais recentes, provavelmente não veríamos software instalado em um volume exFAT, além de aplicativos portáteis, pois ele não tem segurança, mas eu não descartaria o ReFS. Os usuários instalam programas em locais fora do padrão por razões de conveniência, espaço ou desempenho.Sobre como lidar com a limitação do tamanho do caminho no Windows - usar o 7zip para compactar (e descompactar) seus arquivos sensíveis ao comprimento do caminho parece uma solução viável. Usei-o para transportar várias instalações IDE (esses caminhos de plug-in do Eclipse, caramba!) E pilhas de documentação gerada automaticamente e não tive um único problema até agora.
Não tenho muita certeza de como ele foge do limite de 260 caracteres definido pelo Windows (de um PoV técnico), mas, ei, funciona!
Mais detalhes na página do SourceForge aqui :
e notas de versão :
NOTA IMPORTANTE: Para que isso funcione corretamente, você precisará especificar o caminho de destino na caixa de diálogo 7zip "Extrair" diretamente, em vez de arrastar e soltar os arquivos na pasta pretendida. Caso contrário, a pasta "Temp" será usada como um cache intermediário e você retornará à mesma limitação de 260 caracteres quando o Windows Explorer começar a mover os arquivos para o "local de descanso final". Veja as respostas a esta pergunta para mais informações.
fonte
Sim, e é um padrão por algum motivo, mas você pode substituí-lo facilmente por esta chave do Registro:
Consulte: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
fonte
Outra maneira de lidar com isso é usar o Cygwin, dependendo do que você deseja fazer com os arquivos (ou seja, se os comandos do Cygwin atenderem às suas necessidades)
Por exemplo, ele permite copiar, mover ou renomear arquivos que nem o Windows Explorer pode. Ou, é claro, lide com o conteúdo deles, como md5sum, grep, gzip, etc.
Também para os programas que você está codificando, você pode vinculá-los à DLL do Cygwin e permitir que eles usem caminhos longos (ainda não testei isso)
fonte