Eu preciso excluir uma pasta contendo outras pastas e arquivos dentro. Eu tentei del
e rmdir
comandos, mas às vezes eles falham com algumas linhas de erro:[PATH]: The directory isn't empty.
Existe alguma boa alternativa?
Eu preciso excluir uma pasta contendo outras pastas e arquivos dentro. Eu tentei del
e rmdir
comandos, mas às vezes eles falham com algumas linhas de erro:[PATH]: The directory isn't empty.
Existe alguma boa alternativa?
Respostas:
Isso acontece muito com meus scripts de construção automatizados.
Eu acho que o motivo pode ser algum aplicativo que tenha um arquivo aberto nesse diretório com "compartilhamento excluir". Ou seja, o aplicativo permite a exclusão do arquivo (e é por isso que acho que a chamada DeleteFile não falha), mas o arquivo só desaparece depois que o aplicativo fechar o identificador.
Isso significa que o arquivo ainda pode estar lá quando o rmdir
comando tenta excluir a pasta, daí a mensagem de erro. Logo depois disso, o aplicativo fechará sua alça, o arquivo desaparecerá e, quando você inspecionar a pasta para ver qual arquivo rmdir
estava falando, ficará vazio.
Pelo menos essa é a minha teoria.
A solução proposta por Harry Johnston parece ser boa. Somente eu inseriria uma pausa entre os rmdir
comandos. É claro que o Windows não possui um comando de "pausa" facilmente programável (correção: as versões antigas do Windows não, as mais recentes têm - veja os comentários). Mas se granularidade de segundos é suficiente, pode-se usar ping
para criar uma pausa:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Então, no total:
rd /s /q foo
:: retry once
if exist foo (
:: clear errorlevel
cmd /c
:: pause
ping -n 2 127.0.0.1 >nul
:: retry
rd /s /q foo
)
:: retry yet again
if exist foo (
cmd /c
ping -n 2 127.0.0.1 >nul
rd /s /q foo
)
:: give up
if exist foo {panic}
rm -rf /directory/
deve ser global em todos os sistemas operacionais.
timeout /t 3
pause
comando).
Experimentar:
rmdir /S your_directory
ou:
rmdir /S /Q your_directory
para pular as mensagens de confirmação.
del
e rmdir
não pergunto nada, elas apenas enviam algumas linhas como a da descrição.
rmdir /s
excluirá tudo o que for possível excluir. Você pode ter arquivos bloqueados por um programa, arquivos somente leitura ou arquivos que você precisa de acesso administrativo para excluir. Não existe um único comando que cuide de todas essas situações para você
Você pode ter alguns arquivos somente leitura, pode usar a opção del / F para se livrar deles usando
del /S /F your_directory
rmdir your_directory
Você também pode ter alguns arquivos ocultos e, se realmente tiver certeza de que deseja excluí-los, poderá fazer isso usando
del /S /F /AH your_directory
rmdir your_directory
Se isso ainda falhar, você não tem permissão para excluir alguns arquivos ou alguns deles ainda estão em uso.
Eu acredito que há um bug no Windows 7 (e talvez em outras versões) que às vezes causa esse sintoma; ou pode ser um bug em software de terceiros. (Você tem o Symantec Endpoint Protection instalado por acaso?)
Enfim, eu já o encontrei com bastante frequência. Na maioria dos casos, o problema pode ser resolvido executando rd /s /q
duas ou três vezes seguidas.
Se isso estiver em um arquivo em lotes, você poderá fazer algo assim:
rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Use del
nos arquivos internos e rmdir
remova a pasta.
Para usar o rmdir
método para remover todos os arquivos também, use a /S
opção antes do nome do diretório e /Q
suprima da solicitação de exclusão. Essa é a melhor maneira de fazer isso, pois você não perde nenhum arquivo. Tenha cuidado ao usar a opção / Q, pois ela não avisará sobre os atributos de arquivo oculto ou do sistema
As versões mais antigas das pastas do Windows (DOS, Windows 95/98 / ME) DELTREE
são equivalentes a RM
ou RMDIR
. Eu uso DELTREE
na minha estação de trabalho Windows 7 em arquivos em lote muito bem.
Deletes a directory and all the subdirectories and files in it.
To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]
/Y Suppresses prompting to confirm you want to delete
the subdirectory.
[drive:]path Specifies the name of the directory you want to delete.
Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Eu acho que você pode usá-lo assim:
msg*your file is going to delete
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\"
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"