Como excluir diretórios com caminhos / nomes muito longos para a exclusão normal

355

O Windows parece ter um limite de tamanho em nomes de arquivos ao tentar excluir, embora não impeça a criação desses arquivos.

Nosso processo de criação cria vários arquivos temporários (muitos de um WSDL) que são afetados por esse limite. Nosso script ant é de alguma forma capaz de excluí-los ao fazer uma limpeza, mas às vezes eu preciso excluir o diretório workarea (onde todos os arquivos temporários vão) sem realmente fazer uma limpeza completa do formiga.

Estes são os mesmos erros essa questão , mas as respostas não funcionam para mim, já que estou lidando com um diretório, não com um arquivo, e nem sempre sei quais arquivos ou subdiretórios específicos estão causando o problema. E estou tentando evitar qualquer processo manual (além de acionar um único comando) para realmente excluí-los.

Se eu tentar excluir o diretório do Explorer, recebo o erro

Cannot delete [file name]: The file name you specified is not valid or too long.  
Specify a different file name

A tentativa de Remove-Item no PowerShell apresenta o seguinte erro:

Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
At line:1 char:12
+ Remove-Item  <<<< -force -Recurse <directory>

Alguém sabe de alguma ferramenta ou de maneiras fáceis de contornar esse erro de exclusão sem ter que encontrar manualmente os arquivos com problemas e movê-los / renomeá-los?

    
por Herms 03.12.2009 / 20:23

22 respostas

80

Acredito que encontrei uma maneira de excluir coisas de cmd . Originalmente eu tentei o comando del , mas isso não funcionou. Então me lembrei de rmdir . Fazendo o seguinte:

rmdir /S /Q <dir>

parece ter funcionado.

    
por 03.12.2009 / 20:24
402

Use o Gerenciador de arquivos 7-Zip para excluí-los.

Se você ainda estiver tendo problemas, certifique-se de utilizar Shift + Excluir dentro do Gerenciador de Arquivos 7-Zip. Caso contrário, o Windows tentará movê-los para a Lixeira (que falhará novamente).

    
por 03.12.2009 / 20:48
307

Nenhuma das outras respostas (gratuitas) aqui funcionou para mim, mas encontrei uma em outro site:

rimraf <dir>

rimraf é um Node.js pacote, então você precisará instalar o Node.js, que inclui npm . Então você pode correr:

npm install -g rimraf

Então você pode executar rimraf na linha de comando.

Eu encontrei esta solução porque o próprio npm estava causando esse problema devido à forma como ele aninha as dependências.

A propósito, rimraf recebe o nome do comando rm -rf do UNIX, que exclui recursivamente arquivos e pastas.

    
por 04.07.2014 / 08:23
120

Não é necessário instalar nenhum programa para resolver este problema.

Esse problema é facilmente resolvido usando robocopy , pré-instalado desde o Windows Vista, lançado em 2006.

Por exemplo, rmdir /S /Q <dir> foi reportado como falha em alguns casos. Não há necessidade de usar o 7zip ou qualquer outra ferramenta de terceiros. Powershell é um exagero. O Cygwin pode funcionar, mas você pode não tê-lo instalado. Então, vamos nos concentrar em robocopy

A ideia é

  1. use robocopy para copiar + atualizado
  2. de uma nova pasta vazia
  3. para a pasta que você deseja excluir, o destino.

Depois de executar robocopy , o diretório de destino também estará vazio.

Estas instruções são para a linha de comando. Basta abrir a pesquisa no Windows, digite cmd e pressione Enter.

Digamos que o destino para exclusão seja:

C:\delete\this folder\with a very long name

Procederemos da seguinte forma:

  1. Primeiro crie um diretório vazio, f.i. C:\emptyfolder .

    mkdir C:\emptyfolder
    
  2. Copie + atualize do diretório vazio para o destino, usando a opção /purge

    robocopy c:\emptyfolder "C:\delete\this folder\with a very long name" /purge
    
  3. Exclua o diretório vazio. Você não precisa mais disso.

    rmdir c:\emptyfolder
    

Como não há arquivos ou pastas no diretório de origem ( C:\emptyfolder ), ele simplesmente exclui os arquivos e pastas no diretório de destino ( C:\delete\this folder\with a very long name ) recursivamente!

  • Truque final: você pode evitar escrever à mão

    C:\delete\this folder\with a very long name
    

    Arrastando a pasta de uma janela do Explorer e soltando na janela Terminal / cmd.

Cuidado : Os arquivos excluídos não irão para a pasta da lixeira! Uma vez apagados, os arquivos não podem ser recuperados.

(Extraído de " Caminho muito longo? Use Robocopy "por BVLANGEN )

PS: Eu percebo que essa resposta estava aqui, menos didaticamente. Como excluir um arquivo no Windows com um nome de arquivo muito longo? [duplicado]

Benoit adicionado:

You may need to go through this process more than once to get rid of all of the files.

    
por 03.03.2016 / 17:45
29

A ferramenta que usei quando tive esse problema foi FastCopy . Selecionei Excluir tudo no menu suspenso, selecionei o diretório que queria excluir e cliquei em Excluir tudo .

O FastCopy é portátil (não requer instalação) e há versões de 32 e 64 bits disponíveis.

    
por 25.11.2014 / 21:22
24

O rm -rf do Cygwin funciona bem em caminhos longos!

    
por 26.09.2014 / 21:40
24

Sem instalar software adicional, você pode usar o comando subst para criar temporariamente um alias para um longo diretório nomeado.

por exemplo. Se você quiser apagar a pasta C:\Very long directory\that exceed\length limit\blah blah blah\abcde\folder to be deleted você pode usar o comando

subst x: "C:\Very long directory\that exceed\length limit\blah blah blah\abcde"

e, em seguida, você pode excluir X:\folder to be deleted no Windows Explorer ou no prompt de comando com facilidade. Para remover o alias da letra da unidade temporária, use o comando

subst x: /d
    
por 28.10.2014 / 07:09
21

Basta deixar o Powershell no comando executando abaixo:

Cmd /C "rmdir /S /Q <dir>" 
    
por 22.04.2011 / 18:00
17

A solução da Dentrasi é o que funcionou melhor para mim, mas eu queria postar as etapas específicas em uma resposta de nível superior .

  1. Faça o download e instale a versão estável mais recente do 7zip .
  2. Execute o Gerenciador de arquivos 7zip ( 7zfm.exe ).
  3. No Gerenciador de arquivos 7zip, navegue para ver o nome da pasta que deseja excluir (ou seja, você está na pasta pai).
  4. Mantenha o botão Shift pressionado.
  5. Clique no botão " Excluir ", no teclado ou na barra de ferramentas do Gerenciador de arquivos 7zip; verifique se você ainda está segurando a tecla Shift .
  6. Clique no botão " OK "; verifique se você ainda está segurando a tecla Shift .
por 25.06.2015 / 16:19
10

Existem duas coisas que não foram mencionadas nas respostas existentes.

  1. Você pode usar o prefixo de caminho de comprimento estendido para acessar caminhos longos
  2. Com o Windows 10, você pode ativar o suporte a caminhos longos para uso geral - observe, no entanto, que nem todos os aplicativos funcionarão com caminhos longos, você deve testar software antigo. Apenas software com uma entrada de manifesto apropriada poderá fazer uso disso.

Prefixo de caminho longo

A API do Windows tem uma função especial que suporta nomes de caminho Unicode com até 32k caracteres (cada elemento com até 255 caracteres de comprimento).

Isso é muitas vezes erroneamente chamado de nomenclatura UNC, mas não está relacionado.

O prefixo usado para dizer à API para usar caminhos longos de Unicode é \?\ como em:

\?\D:\very long path

Os nomes UNC são normalmente usados ao se referir a caminhos em servidores remotos no formulário \servername\path name\file name . Você pode combinar isso com o prefixo de caminho longo, então: \?\UNC\server\share

Observe que alguns aplicativos, mal escritos, mas infelizmente muito comuns, não suportam caminhos de arquivos UNC nem o prefixo de caminho longo.

Referência: link

Suporte a caminhos longos

Esta é uma opção que foi adicionada às versões recentes do Windows 10. Não é, no momento da escrita, ativada por padrão, já que requer suporte específico a aplicativos. Curiosamente, o PowerShell tem suporte embutido, portanto, ativar essa opção permitirá que caminhos longos sejam usados diretamente em scripts do PowerShell.

Você pode ativá-lo através do editor de Diretiva de Grupo se tiver uma versão do Windows com isso. Ou você pode simplesmente usar a seguinte alteração do Registro. Como sempre, faça o backup da seção do registro que você está alterando antes de fazer qualquer coisa.

  1. Executar regedit.exe .
  2. Confirme o prompt do UAC.
  3. Navegue até a chave: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
  4. Crie ou altere a chave LongPathsEnabled .
  5. Se não existir, clique com o botão direito do mouse em Políticas e selecione Novo > Dword (32 bits) Valor do menu.
  6. Defina LongPathsEnabled para 1 para ativar.

Quaisquer aplicações com entradas de manifesto apropriadas terão agora acesso a caminhos longos padrão POSIX. Isso deve incluir aplicativos da Windows Store.

Referência: link

ATUALIZAÇÃO 2017-04-09

@maoizm apontou um problema com a chave de registro acima, então explodi . Parece que agora você pode definir suporte a nomes extensos de arquivos com uma chave do sistema:

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)

Isso ainda funciona apenas para aplicativos especificamente definidos para usá-lo (requer uma entrada no manifest.xml do aplicativo).

Você também deve observar que não é possível usar nomes de caminho relativos com esse método.

    
por 09.09.2016 / 12:52
8

Eu gosto da solução cmd. Embora eu queira compartilhar outra solução alternativa que funciona até mesmo no Explorer: tente encurtar os nomes das pastas pai antes da exclusão: nomes mais curtos encurtarão o caminho. Diga, você tem essa estrutura em árvore da pasta:

C: \

.. Projetos

.. .. Algum projeto incrível durante a primavera de 2014

.. .. .. Alguma atividade no parque da cidade na sexta-feira

.. .. .. .. Bla bla bla bla bla bla bla bla bla bla bla bla

.. .. .. .. .. arquivos reais com nomes longos também

Neste caso, você não pode excluir as pastas, você não pode excluir ou renomear os arquivos também. Se você quiser remover toda a estrutura de pastas ou parte dela, poderá renomear temporariamente as pastas pai e encurtar o caminho e, em seguida, remover a pasta. Os nomes podem ser apenas letras:

C: \

.. Projetos

.. .. x

.. .. .. y

.. .. .. z

.. .. .. .. .. arquivos reais com nomes longos também

No meu caso, eu só queria remover a pasta inteira com muitas subpastas e arquivos. Então não me importei com os nomes das pastas.

    
por 28.10.2014 / 06:52
7

A solução 7-zip funciona bem. Outra opção se você tiver o git instalado é abrir um shell bash e usar:

rm -f

(ou rm -rf para pastas)

    
por 11.01.2016 / 15:22
4

Eu sugiro Total Commander (shareware, mas continua trabalhando após o período de teste com apenas uma tela inicial mínima). Essa é a maneira que eu sempre resolvo os problemas do nome de arquivo longo demais .

    
por 29.04.2014 / 17:47
2

Você também pode excluí-los usando o nome abreviado equivalente. dir /x mostrará a você.

    
por 06.11.2010 / 17:24
2

Eu criei um programa java simples que usa o robocopy para excluir os arquivos. O jarro é um runnable. Para saída adicional, execute a partir da linha cmd.

link

    
por 08.02.2015 / 22:07
1

Eu tentei todas as outras respostas, mas elas não funcionaram (pelo menos para mim).

Medepareicom delinfile e trabalhei muito bem e rapidamente!

O teste está limitado a 3 ações / 15 dias, mas pode ser usado se você quiser excluir apenas algumas pastas / arquivos:

    
por 20.12.2013 / 07:10
1

Diretórios Maiores foi desenvolvido para essa tarefa também.

  • Download
  • Usa uma chamada recursiva com RemoveDirectoryW para excluir diretórios existentes
  • Usa o próprio repositório de arquivos para diretórios recém-criados
  • Arquivos podem ser movidos dos diretórios antes da exclusão de diretórios contendo.
  • Rápido, embora a navegação para o início do diretório seja um clique por diretório aninhado
  • Windows XP (SP3) e superior
  • Código não gerenciado não assinado sem instalador, portanto, possível aviso do Smartscreen quando executado a partir da pasta de reposição, por exemplo, área de trabalho.

Mais informações em CodeProject .

    
por 09.01.2017 / 13:08
1

Eu enfrentei esse problema no Windows 10 e achei essa solução fácil.

  1. Entre um pouco mais fundo na sua árvore de pastas.
  2. Arraste e solte uma pasta de algum lugar no meio da árvore para algum lugar da árvore usando a barra de endereço.
  3. Como na minha imagem, arraste e solte a caixa vermelha na caixa verde. (neste caso o caminho é mais curto, mas para caminhos longos também funciona)
  4. Em seguida, seu caminho fica mais curto e é excluído normalmente usando a tecla delete.

    
por 13.06.2017 / 09:52
1

Obtive a resposta perfeita aqui (para arquivos). Funciona no Windows 10.

REM Make sure there is no \ at the end of either path!
robocopy "C:\...\...\...\long\path" "C:\DeleteMe" "FileName" /MOV
REM Note: this ^ can be called many times before...:

REM Finally, recursively delete the higher up DeleteMe directory.
rmdir /S /Q DeleteMe

Veja também: link

Nenhuma resposta alternativa em 4 perguntas foi suficiente para minhas necessidades. Você é bem vindo mundo.

    
por 28.10.2017 / 02:35
0

Eu finalmente descobri como fazer isso via Powershell. Aqui estão as instruções que segui para fazer isso funcionar no Windows 7:

  1. Crie uma nova pasta chamada NTFSSecurity na pasta C: \ Usuários \ XXXX \ Documents \ WindowsPowerShell \ Módulos \ NTFSSecurity , onde XXXX é o seu nome de usuário do Windows. Exemplo: se meu nome de usuário for " aspnyc ", a nova pasta será C: \ Usuários \ aspnyc \ Documents \ WindowsPowerShell \ Módulos \ NTFSSecurity .

  2. Faça o download do pacote do módulo PowerShell do sistema de arquivos - ele deve estar disponível como um arquivo ZIP simples.

  3. Abra um console do Powershell, execute o Get-Module -ListAvailable e certifique-se de que o NTFSSecurity aparece em algum lugar na lista de módulos registrados.
  4. No console do Powershell, execute o NTFSSecurity do módulo de importação .
  5. No console do Powershell, execute Remove-Item2 "YYYY" -Recurse , onde YYYY é o caminho do Windows para a pasta que você deseja excluir recursivamente (por exemplo, C: \ Batatas \ Badgers \ FolderToDelete ).
por 25.06.2015 / 18:47
0

Eu finalmente descobri como fazer isso com o Powershell no Windows 10, onde os nomes de arquivos individuais eram muito longos. Aqui estão os passos que segui para que isso funcione no Windows 10:

  1. Faça o download do pacote do módulo PowerShell do sistema de arquivos - ele deve estar disponível como um arquivo ZIP simples.
  2. Extraia o arquivo Zip como uma pasta NTFSSecurity no diretório C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ Modules.
  3. Abra um console do Powershell com a elevação administrativa (também em Modo Admin) e execute o Get-Module -ListAvailable e certifique-se de que o NTFSSecurity aparece em algum lugar na lista de módulos registrados.
  4. Execute Set-ExecutionPolicy Unrestricted para ignorar o modo de execução assinado. Você tem que confirmar esta ação com um Y (es)
  5. Por fim, faça o cd para a pasta que você deseja excluir.
  6. No console do Powershell, execute o NTFSSecurity do módulo de importação .
  7. No console do Powershell, execute Remove-Item2 "YYYY" -Recurse , onde YYYY é o caminho relativo ou absoluto do Windows para a pasta que você deseja excluir recursivamente ( eg C: \ Batatas \ Badgers \ FolderToDelete ).
  8. Verifique se funcionou.
  9. Eventualmente, retorne ao modo de execução assinado com Set-ExecutionPolicy Restricted . Você tem que confirmar esta ação com Y (es).
por 09.10.2015 / 18:08
0

Se você tiver o Bash no Ubuntu no Windows instalado, você pode criar um cd para o diretório pai em um prompt de comando regular e digitar:

bash -c "rm -rf dirname_here"

Que lança o bash, exclui recursivamente o diretório do linux, onde não há restrições de nome de arquivo, e então sai de volta ao seu prompt de comando regular.

    
por 05.07.2017 / 12:44