Superando restrições máximas de tamanho de caminho de arquivo no Windows

36

Um de nossos clientes costuma usar nomes de caminhos muito longos (várias pastas aninhadas, com nomes longos) e encontramos rotineiramente "problemas de educação do usuário" para reduzir o caminho para menos de 260 caracteres.

Existe uma solução técnica disponível, podemos pressionar algum tipo de opção no Windows 7 e no Windows 2008 R2 para dizer "sim, ignore esses problemas históricos e faça o nome do caminho de +260 caracteres funcionar".

PS: Li e fui totalmente indeditado por nomear arquivos, caminhos e espaços para nome

Christopher Edwards
fonte
3
Aqui estamos em 2018 e o problema ainda existe no ROBOCOPY. Limite 255. Aqueles que o excedem simplesmente apitam, mas não copiam.
SDsolar 23/05/19
@SDsolar: você está usando uma versão antiga do robocopy?
Naikrovek 5/11
Sim, ia dizer o mesmo - é preciso usar robocopy especificamente porque ele pode lidar com caminhos longos ...
Rob Nicholson

Respostas:

12

Os métodos estão lá, mas até a Microsoft recodificar o widget do navegador de arquivos, estamos praticamente presos ao antigo problema. É sub-ideal, mas é assim que funciona.

sysadmin1138
fonte
5
Bug no software MS que foi unfixed para algumas versões do SO, que é um novo ...
Hubert Kario
2
Windows 10 1607 finalmente resolveu o problema arquivo-browser e tem alguma magia para enganar aplicações Win32 para trabalhar neste estranho mundo novo de grandes caminhos: howtogeek.com/266621/...
HackSlash
28

Apenas mencionando um truque que não vejo mencionado aqui ainda.

Pegue este arquivo por exemplo:

C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

O caminho completo do arquivo tem 290 caracteres. O shell (Windows Explorer) e a maioria dos utilitários de linha de comando provavelmente não permitirão que você toque nele.

Use o substcomando da seguinte maneira:

subst X: "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow"

Agora você pode acessar (e excluir, mover, etc.) o arquivo assim:

X:\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

E agora que o nome do arquivo tem apenas ~ 235 caracteres, você não encontrará mais os problemas "O nome do arquivo é muito longo".

Na API do Windows, há uma constante infame conhecida como MAX_PATH. MAX_PATH tem 260 caracteres. O sistema de arquivos NTFS, na verdade, suporta caminhos de arquivo de até 32.767 caracteres. E você ainda pode usar nomes de caminho longos com 32.767 caracteres acessando as versões Unicode (ou "ampla") das funções da API do Windows e também prefixando o caminho com \\?\.

MAX_PATHfoi gravado há muito tempo no mundo Windows. Eu acho que tem algo a ver com os padrões ANSI na época ... mas é uma daquelas coisas que é muito difícil para a Microsoft mudar agora, já que agora temos milhares de programas e aplicativos, incluindo alguns escritos pela própria Microsoft, que usam MAX_PATHe falharia de maneiras novas e estranhas se a constante fosse subitamente alterada. (Estouros de buffer, corrupção de heap, etc.)

Ryan Ries
fonte
9
Eu tenho adotado uma abordagem semelhante ao substuso de junções de diretório, que pode ser mais conveniente para a limpeza se você estiver apenas procurando fazer algumas alterações rápidas. Eu uso Fazer a ligação Shell Extension , mas você pode simplesmente usar o mklinkcomando assim: mklink /J C:\Wow "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow".
Charles Grunwald
10

Você pode contornar essa limitação usando a notação \\? \ C:. É feio, mas suporta comprimentos de arquivo de até 2 ^ 15.

http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#maxpath

Chris K
fonte
2
Sim, eu li isso, como eu disse (veja o meu link). Mas como me beneficio exatamente disso? Posso mapear uma unidade para \\? \ Algo por exemplo. Eu não entendo O artigo é destinado a programadores que usam APIs do Windows. Embora eu codifique no .NET conforme necessário, não uso C ++ etc. e não consigo ver como isso é relevante para a equipe de meus clientes que estão usando o Windows Explorer e a caixa de diálogo de arquivo comum etc.
Christopher Edwards
1
Em última análise, não há. :-/ Infelizmente.
Chris K
@ChristopherEdwards Você pode criar junções para pontos mais baixos na hierarquia de pastas.
Hubert Kario 23/11
1
@ChristopherEdwards você pode criar um link c:\usr-datapara `c: \ Users \ VeryLongUserName \ LongFolderName` e dizer a ele para usar o primeiro, mas se ele nomear regularmente pastas com caracteres de 40 e poucos, isso não ajudará ...
Hubert Kario
2
O 7-zip navegará e copiará com prazer a notação \\? \ C: para o que vale a pena.
Matt Lyons
9

A Microsoft agora tem uma correção disponível para esse início no Windows 10, explicada no artigo MSDN sobre nomes de arquivos, caminhos e espaços para nome .

O darthcoder já respondeu com detalhes sobre a solução alternativa da \\?\C:notação, mas agora existe uma chave de registro na HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)qual pode ser usada para remover as limitações do MAX_PATH para um único sistema. O artigo também menciona o suporte ao controle de Diretiva de Grupo na Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long pathsorganização ou implementação em todo o grupo, se necessário.

JimNim
fonte
Ainda não tive tempo para testes completos, mas vi resultados mistos com essa solução até agora e não posso confirmar que isso resolve o problema do Windows [arquivo] Explorer.
JimNim
2
Isso não funciona no File Explorer porque, embora o sistema e o NTFS possam manipular caminhos longos, o Explorer não pode até que seja recodificado.
ingyhere
PS, você precisará usar um dos programas de cópia neste link da SO no topo do Explorer para realmente fazê-lo funcionar.
ingyhere
1
Boa informação! Provavelmente vou me ater ao Robocopy nesse caso.
JimNim