Como faço para excluir um diretório e todo o seu conteúdo (arquivos e subdiretórios) no PHP?
php
recursion
delete-directory
Itay Moav-Malimovka
fonte
fonte
Respostas:
A seção contribuída pelo usuário na página de manual
rmdir
contém uma implementação decente:fonte
is_dir
duas vezes para cada diretório recorrente. Se o argumento for um link simbólico, ele também será seguido em vez de excluir o link simbólico, que pode ou não ser o que você deseja. De qualquer forma, não é o querm -rf
faz.Com base no comentário do The Pixel Developer , um snippet usando o SPL pode se parecer com:
Nota: Ele faz nenhuma verificação de sanidade e faz uso da bandeira SKIP_DOTS introduzida com a FilesystemIterator no PHP 5.3.0. Claro, o
$todo
poderia ser umif
/else
. O ponto importante é queCHILD_FIRST
é usado para iterar os filhos (arquivos) primeiro antes de seus pais (pastas).fonte
SKIP_DOTS
foi introduzido apenas no PHP 5.3? Onde você viu isso?getPathname()
método em vez degetRealPath()
?rmdir($dir)
no final do script.rmdir()
eunlink()
, por exemplo, abortaE_WARNING
e retornatrue
oufalse
indica sucesso.FilesystemIterator
não é um iterador recursivo.Exclui todos os arquivos e pastas no caminho.
fonte
rm -rf /
==recurseRmdir('/')
:)is_dir("$dir/$file")
parais_dir("$dir/$file") && !is_link("$dir/$file")
Para * nix, você pode usar um
shell_exec
pararm -R
ouDEL /S folder_name
para Windows.fonte
DEL /S folder_name
for WindowsRMDIR /S /Q folder_name
é o que funcionou para mimexec('rm -rf ' . __DIR__ . '/output/*.log');
fonte
Há outra discussão com mais exemplos aqui: Uma função de diretório de remoção recursiva para PHP?
Se você estiver usando o Yii, poderá deixá-lo na estrutura:
fonte
código 'simples' que funciona e pode ser lido por uma criança de dez anos:
Observe que tudo o que fiz foi expandir / simplificar e corrigir (não funcionou para o diretório não vazio) a solução aqui: No PHP, como removo recursivamente todas as pastas que não estão vazias?
fonte
Solução aprimorada do @Artefacto - erros de digitação corrigidos e código simplificado, trabalhando para ambos - diretórios vazios && não vazios.
fonte
A solução 100% funcional
fonte
Algo assim?
fonte
Exemplo com a função glob () . Ele excluirá todos os arquivos e pastas recursivamente, incluindo arquivos que começam com ponto.
fonte
system('rm -fr folder')
A função unlinkr exclui recursivamente todas as pastas e arquivos no caminho especificado, certificando-se de que não exclui o próprio script.
se você deseja excluir todos os arquivos e pastas em que coloca esse script, chame-o da seguinte maneira
se você quiser apenas excluir apenas arquivos php, chame-o da seguinte forma
você pode usar qualquer outro caminho para excluir os arquivos também
Isso excluirá todos os arquivos no diretório home / user / temp.
fonte
Eu uso esse código ...
ou este ...
fonte
Quando terminar de executar os testes, remova # do #unlink e #rmdir da classe.
fonte
cleanup.php:
fonte
Parece que todas as outras respostas assumem que o caminho fornecido para a função é sempre um diretório. Essa variante funciona para remover diretórios e arquivos únicos:
fonte
Usando DirectoryIterator e recursão corretamente:
fonte
Acabei de criar esse código, a partir de algumas discussões do StackOverflow. Ainda não testei no ambiente Linux. É feito para excluir completamente um arquivo ou diretório:
fonte
fonte
Variante modificada da solução @XzaR. Ele remove as pastas vazias quando todos os arquivos são excluídos e lança exceções em vez de retornar falso por erros.
fonte
fonte
unlink
,rmdir
oopendir
+readdir
funciona mais rápido que issoscandir
eRecursiveDirectoryIterator
também usa menos memória que todos. Para remover a pasta que eu tenho queclosedir
primeiro, eu estava preso nisso. Graças a esta resposta.