2012-06-29 24 views
28

Existe una manera en que puedo usar las búsquedas RegExp o Wildcard para eliminar rápidamente todos los archivos dentro de una carpeta, y luego eliminar esa carpeta en PHP, SIN usar el "ejecutivo "¿comando? Mi servidor no me da autorización para usar ese comando. Un simple bucle de algún tipo sería suficiente.PHP: Desvincular todos los archivos dentro de un directorio y luego eliminar ese directorio

Necesito algo que lograría la lógica detrás de la siguiente declaración, pero, obviamente, sería válida:

 

$dir = "/home/dir" 
unlink($dir . "/*"); # "*" being a match for all strings 
rmdir($dir); 
 
+0

http://stackoverflow.com/questions/3349753/php-delete- directorio-con-archivos-en-él – John

+0

http://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-filessub-dirs – Jocelyn

Respuesta

75

Uso glob para encontrar todos los archivos que coinciden con un patrón.

function recursiveRemoveDirectory($directory) 
{ 
    foreach(glob("{$directory}/*") as $file) 
    { 
     if(is_dir($file)) { 
      recursiveRemoveDirectory($file); 
     } else { 
      unlink($file); 
     } 
    } 
    rmdir($directory); 
} 
+2

Tengo un error 'máximo nivel de anidación de función de '100' alcanzado' – Smith

+0

Estaba teniendo problemas de permiso con una función' scandir' en mi código, ¡ahora funciona perfectamente con esta versión! – SeinopSys

+1

glob se ocupa de los archivos ocultos? – amar

16

Uso glob() fácilmente bucle a través del directorio para borrar archivos luego se puede quitar el directorio.

foreach (glob($dir."/*.*") as $filename) { 
    if (is_file($filename)) { 
     unlink($filename); 
    } 
} 
rmdir($dir); 
+12

este código es peligroso, la ruta debe incluirse en el glob como 'glob ($ dir." /*.* ")'.Lo intenté y borró todo el directorio, incluidos los mejores, mi trabajo duro – Smith

1

Una forma de hacerlo sería:

function unlinker($file) 
{ 
    unlink($file); 
} 
$files = glob('*.*'); 
array_walk($files,'unlinker'); 
rmdir($dir); 
9

La función glob() hace lo que usted está buscando. Si estás en PHP 5.3+ se podría hacer algo como esto:

$dir = ... 
array_walk(glob($dir . '/*'), function ($fn) { 
    if (is_file($fn)) 
     unlink($fn); 
}); 
unlink($dir); 
2

Puede utilizar el Symfony Filesystem component, para evitar la re-inventar la rueda, lo que puede hacer

use Symfony\Component\Filesystem\Filesystem; 

$filesystem = new Filesystem(); 

if ($filesystem->exists('/home/dir')) { 
    $filesystem->remove('/home/dir'); 
} 

Si prefiere para gestionar el código usted mismo, aquí está la base de código de Symfony para los métodos pertinentes

class MyFilesystem 
{ 
    private function toIterator($files) 
    { 
     if (!$files instanceof \Traversable) { 
      $files = new \ArrayObject(is_array($files) ? $files : array($files)); 
     } 

     return $files; 
    } 

    public function remove($files) 
    { 
     $files = iterator_to_array($this->toIterator($files)); 
     $files = array_reverse($files); 
     foreach ($files as $file) { 
      if (!file_exists($file) && !is_link($file)) { 
       continue; 
      } 

      if (is_dir($file) && !is_link($file)) { 
       $this->remove(new \FilesystemIterator($file)); 

       if (true !== @rmdir($file)) { 
        throw new \Exception(sprintf('Failed to remove directory "%s".', $file), 0, null, $file); 
       } 
      } else { 
       // https://bugs.php.net/bug.php?id=52176 
       if ('\\' === DIRECTORY_SEPARATOR && is_dir($file)) { 
        if (true !== @rmdir($file)) { 
         throw new \Exception(sprintf('Failed to remove file "%s".', $file), 0, null, $file); 
        } 
       } else { 
        if (true !== @unlink($file)) { 
         throw new \Exception(sprintf('Failed to remove file "%s".', $file), 0, null, $file); 
        } 
       } 
      } 
     } 
    } 

    public function exists($files) 
    { 
     foreach ($this->toIterator($files) as $file) { 
      if (!file_exists($file)) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 
6

Trate manera fácil:

$dir = "/home/dir"; 
array_map('unlink', glob($dir."/*")); 
rmdir($dir); 

En función para quitar dir:

function unlinkr($dir, $pattern = "*") { 
     // find all files and folders matching pattern 
     $files = glob($dir . "/$pattern"); 
     //interate thorugh the files and folders 
     foreach($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('..', '.'))) { 
       unlinkr($file, $pattern); 
       //remove the directory itself 
       rmdir($file); 
       } else if(is_file($file) and ($file != __FILE__)) { 
       // make sure you don't delete the current script 
       unlink($file); 
      } 
     } 
     rmdir($dir); 
    } 

//call following way: 
unlinkr("/home/dir"); 
+2

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – Bono

4

Una manera simple y efectiva de eliminar todos los archivos y carpetas de forma recursiva con Standard PHP Library, para ser específicos, RecursiveIteratorIterator y RecursiveDirectoryIterator. El punto está en el indicador RecursiveIteratorIterator::CHILD_FIRST, el iterador recorrerá primero los archivos y el directorio al final, por lo que una vez que el directorio esté vacío, es seguro usar rmdir().

foreach(new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator('folder', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), 
    RecursiveIteratorIterator::CHILD_FIRST) as $value) { 
     $value->isFile() ? unlink($value) : rmdir($value); 
} 

rmdir('folder'); 
0

para eliminar todos los archivos que puede eliminar el directorio y hacer de nuevo .. con una simple línea de código

<?php 
    $dir = '/home/files/'; 
    rmdir($dir); 
    mkdir($dir); 
?> 
Cuestiones relacionadas