É bom que essa pergunta tenha sido respondida abaixo antes de ser marcada como duplicada. As respostas abaixo são muito melhores do que a pergunta respondida vinculada. Além disso, a pergunta é diferente, esta pergunta pede para esvaziar um diretório, não para excluir.
Bart Burg
1
Sim, esta é uma pergunta diferente que atraiu respostas diferentes. Não deve ser marcado como duplicado.
Daniel Bingham
Respostas:
639
$files = glob('path/to/temp/*');// get all file namesforeach($files as $file){// iterate filesif(is_file($file))
unlink($file);// delete file}
Se você deseja remover arquivos 'ocultos' como .htaccess, você deve usar
Também há DirectoryIterator ou DirectoryRecursiveIterator.
Eugene
6
Embora seja óbvio, eu mencionaria que, por exemplo, 'caminho / para / temp / * .txt' removerá apenas arquivos txt e assim por diante.
Tertium 31/03
Isso também funciona para caminhos relativos? Então, digamos que o caminho completo seja "/ var / www / html / folder_and_files_to_delete /" E o script de exclusão seja colocado em "/var/www/html/delete_folders_and_files.php". Posso apenas tomar "folder_and_files_to_delete" como caminho?
yoano 31/03
1
@yoano sim, desde que o caminho relativo esteja correto.
#
O glob pode ser usado se o diretório tiver dezenas de milhares ou centenas de milhares de arquivos?
Dave Heq
260
Se você deseja excluir tudo, desde a pasta (incluindo subpastas) usar esta combinação de array_map, unlinke glob:
Isso funciona muito bem, quando você não tem acesso SSH e o FTP leva literalmente horas para excluir recursivamente muitos arquivos e pastas ... com essas linhas, excluí 35.000 arquivos em menos de 3 segundos!
Guari
Para usuários do PHP 7.1: $ file-> getRealPath () deve ser usado em vez de $ file. Caso contrário, o PHP fornecerá um erro dizendo que desvincular requer um caminho, não uma instância do SplFileInfo.
'DirectoryIterator' também não itera sobre subdiretórios? Nesse caso, 'desvincular' geraria um aviso nesses casos. O corpo do loop não deveria parecer mais com a resposta de Yamiko e verificar cada entrada se é um arquivo antes de chamar 'desvincular'?
/**
* Delete a file or recursively delete a directory
*
* @param string $str Path to file or directory
*/function recursiveDelete($str){if(is_file($str)){return@unlink($str);}
elseif (is_dir($str)){
$scan = glob(rtrim($str,'/').'/*');foreach($scan as $index=>$path){
recursiveDelete($path);}return@rmdir($str);}}
Assumir que você tem uma pasta com MUITOS arquivos lendo todos eles e excluindo em duas etapas não está funcionando. Acredito que a maneira mais eficiente de excluir arquivos é usar apenas um comando do sistema.
Por exemplo, no Linux eu uso:
exec('rm -f '. $absolutePathToFolder .'*');
Ou isso, se você deseja excluir recursivamente sem a necessidade de escrever uma função recursiva
exec('rm -f -r '. $absolutePathToFolder .'*');
os mesmos comandos exatos existem para qualquer sistema operacional suportado pelo PHP. Lembre-se de que essa é uma maneira EXCLUSIVA de excluir arquivos. $ absolutePathToFolder DEVE ser verificado e protegido antes de executar este código e as permissões devem ser concedidas.
Pouco inseguro usando este método, se $absolutePatToFolderestá sempre vazio
Lawrence Cherone
@LawrenceCherone Existem outras alternativas mais seguras?
robsch
3
@LawrenceCherone Espero que ninguém execute php com permissões de root hoje em dia. Sendo sério, espero que a entrada seja "segura", como todas as funções acima.
Dario Corno
As soluções mais votadas não funcionam em ambientes de desenvolvimento em que www ou www-data não é o proprietário. Cabe ao administrador do servidor garantir que os direitos adequados da pasta sejam definidos. exec é uma ferramenta inestimável para fazer as coisas, e com grande poder, etc. stackoverflow.com/a/2765171/418974
Christian Bonato
@LawrenceCherone você está totalmente correto, minha resposta foi feita para uma situação muito específica, apenas por razões de desempenho. Modifiquei minha resposta de acordo com suas anotações.
Dario Corno
8
A maneira simples e melhor de excluir todos os arquivos de uma pasta no PHP
$files = glob('my_folder/*');//get all file namesforeach($files as $file){if(is_file($file))
unlink($file);//delete file}
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.
function unlinkr($dir, $pattern ="*"){// find all files and folders matching pattern
$files = glob($dir ."/$pattern");//interate thorugh the files and foldersforeach($files as $file){//if it is a directory then re-call unlinkr function to delete files inside this directory if(is_dir($file)and!in_array($file, array('..','.'))){
echo "<p>opening directory $file </p>";
unlinkr($file, $pattern);//remove the directory itself
echo "<p> deleting directory $file </p>";
rmdir($file);}elseif(is_file($file)and($file != __FILE__)){// make sure you don't delete the current script
echo "<p>deleting file $file </p>";
unlink($file);}}}
se você deseja excluir todos os arquivos e pastas em que coloca esse script, chame-o da seguinte maneira
//get current working directory
$dir = getcwd();
unlinkr($dir);
Se você quiser apenas excluir apenas arquivos php, chame-o da seguinte forma
unlinkr($dir,"*.php");
você pode usar qualquer outro caminho para excluir os arquivos também
unlinkr("/home/user/temp");
Isso excluirá todos os arquivos no diretório home / user / temp.
Publicou uma classe de manipulação de arquivos e pastas de uso geral para copiar, mover, excluir, calcular tamanho etc., que pode lidar com um único arquivo ou um conjunto de pastas.
Há um pacote chamado "Pusheh". Com ele, você pode limpar um diretório ou remover um diretório completamente ( link do Github ). Também está disponível no Packagist .
Por exemplo, se você deseja limpar o Tempdiretório, pode:
Pusheh::clearDir("Temp");// Or you can remove the directory completelyPusheh::removeDirRecursively("Temp");
Respostas:
Se você deseja remover arquivos 'ocultos' como .htaccess, você deve usar
fonte
Se você deseja excluir tudo, desde a pasta (incluindo subpastas) usar esta combinação de
array_map
,unlink
eglob
:Essa chamada também pode lidar com diretórios vazios (obrigado pela dica, @mojuba!)
fonte
glob("...") ?: []
(PHP 5.4+) porque, para um diretório vazio,glob()
retornafalse
.array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Aqui está uma abordagem mais moderna usando a Standard PHP Library (SPL) .
fonte
fonte
Este código de http://php.net/unlink :
fonte
fonte
Consulte readdir e desvincular .
fonte
Assumir que você tem uma pasta com MUITOS arquivos lendo todos eles e excluindo em duas etapas não está funcionando. Acredito que a maneira mais eficiente de excluir arquivos é usar apenas um comando do sistema.
Por exemplo, no Linux eu uso:
Ou isso, se você deseja excluir recursivamente sem a necessidade de escrever uma função recursiva
os mesmos comandos exatos existem para qualquer sistema operacional suportado pelo PHP. Lembre-se de que essa é uma maneira EXCLUSIVA de excluir arquivos. $ absolutePathToFolder DEVE ser verificado e protegido antes de executar este código e as permissões devem ser concedidas.
fonte
$absolutePatToFolder
está sempre vazioA maneira simples e melhor de excluir todos os arquivos de uma pasta no PHP
Obtenha este código fonte aqui - http://www.codexworld.com/delete-all-files-from-folder-using-php/
fonte
Outra solução: Esta classe exclui todos os arquivos, subdiretórios e arquivos nos subdiretórios.
fonte
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
Publicou uma classe de manipulação de arquivos e pastas de uso geral para copiar, mover, excluir, calcular tamanho etc., que pode lidar com um único arquivo ou um conjunto de pastas.
https://gist.github.com/4689551
Usar:
Para copiar (ou mover) um único arquivo ou um conjunto de pastas / arquivos:
Exclua um único arquivo ou todos os arquivos e pastas em um caminho:
Calcule o tamanho de um único arquivo ou de um conjunto de arquivos em um conjunto de pastas:
fonte
fonte
Para mim, a solução
readdir
foi melhor e funcionou como um encanto. Comglob
, a função falhou em alguns cenários.fonte
Atualizei a resposta do @Stichoza para remover arquivos através de subpastas.
fonte
fonte
Há um pacote chamado "Pusheh". Com ele, você pode limpar um diretório ou remover um diretório completamente ( link do Github ). Também está disponível no Packagist .
Por exemplo, se você deseja limpar o
Temp
diretório, pode:Se você estiver interessado, consulte o wiki .
fonte