2012-06-29 13 views
28

Esiste un modo per utilizzare le ricerche RegExp o Wildcard per eliminare rapidamente tutti i file all'interno di una cartella, quindi rimuovere la cartella in PHP, SENZA utilizzare "exec "comando? Il mio server non mi autorizza ad usare quel comando. Un semplice ciclo di qualche tipo sarebbe sufficiente.PHP: Scollega tutti i file all'interno di una directory e quindi elimina quella directory

ho bisogno di qualcosa che avrebbe compiere la logica dietro la seguente dichiarazione, ma, ovviamente, sarebbe valida:

 

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

http://stackoverflow.com/questions/3349753/php-delete- directory-con-file-in-it – John

+0

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

risposta

75

Usa glob per trovare tutti i file che corrispondono a un modello.

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

Ho ottenuto un 'errore' massimo livello di nidificazione delle funzioni '100' raggiunto ' – Smith

+0

Avevo dei problemi di autorizzazione con una funzione 'scandir' nel mio codice, ora funziona perfettamente con questa versione! – SeinopSys

+1

glob si prende cura dei file nascosti? – amar

16

Usa glob() facilmente scorrere l'elenco per eliminare i file quindi è possibile rimuovere la directory.

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

questo codice è pericoloso, il percorso dovrebbe essere incluso nel glob come così 'glob ($ dir." /*.* ")'.l'ho provato e ha cancellato tutte le directory incluse quelle più importanti del mio duro lavoro – Smith

1

Un modo per farlo sarebbe:

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

La funzione glob() fa quello che stai cercando. Se siete su PHP 5.3+ si potrebbe fare qualcosa di simile:

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

È possibile utilizzare il Symfony Filesystem component, per evitare di re-inventare la ruota, in modo da poter fare

use Symfony\Component\Filesystem\Filesystem; 

$filesystem = new Filesystem(); 

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

Se preferite per gestire il codice da soli, ecco il codice di base Symfony per i relativi metodi

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

Prova modo semplice:

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

In funzione per rimuovere 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

Mentre questo snippet di codice può risolvere la domanda, [inclusa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entely- risposte basate sul codice) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – Bono

4

Un modo semplice ed efficace di eliminare tutti i file e le cartelle in modo ricorsivo con Standard PHP Library, per essere precisi, RecursiveIteratorIterator e RecursiveDirectoryIterator. Il punto è nel flag RecursiveIteratorIterator::CHILD_FIRST, l'iteratore passerà prima i file e infine la directory, quindi una volta che la directory è vuota è possibile utilizzare 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

per la rimozione di tutti i file che è possibile rimuovere la directory e fare di nuovo .. con una semplice riga di codice

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