2009-08-26 22 views
27

Ho bisogno di cancellare una cartella con contenuti usando PHP. rmdir() e unlink() eliminano le cartelle vuote, ma non sono in grado di eliminare le cartelle con contenuti.Come eliminare una cartella con contenuti usando PHP

+6

@@ Maerlyn: Ho postato questa domanda in data 26 agosto 2009. Quello che lei ha citato duplicato è stato pubblicato il 28 luglio 2010 .. Credo che tu sappia cosa fare ORA ... Prima di fare qualcosa per favore verifica una volta. – Fero

risposta

80

Questa funzione vi permetterà di eliminare qualsiasi cartella (a patto che sia scrivibile) ed è file e sottodirectory.

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = array_diff(scandir($path), array('.', '..')); 

     foreach ($files as $file) 
     { 
      Delete(realpath($path) . '/' . $file); 
     } 

     return rmdir($path); 
    } 

    else if (is_file($path) === true) 
    { 
     return unlink($path); 
    } 

    return false; 
} 

O senza ricorsione usando RecursiveDirectoryIterator:

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); 

     foreach ($files as $file) 
     { 
      if (in_array($file->getBasename(), array('.', '..')) !== true) 
      { 
       if ($file->isDir() === true) 
       { 
        rmdir($file->getPathName()); 
       } 

       else if (($file->isFile() === true) || ($file->isLink() === true)) 
       { 
        unlink($file->getPathname()); 
       } 
      } 
     } 

     return rmdir($path); 
    } 

    else if ((is_file($path) === true) || (is_link($path) === true)) 
    { 
     return unlink($path); 
    } 

    return false; 
} 
+2

Ottimo metodo, uomo . Stavo usando il comando più semplice: , ma sfortunatamente alcuni server non consentono il comando di sistema, quindi il tuo (ho scelto il primo) è una sostituzione molto buona e semplice. Grazie Fratello. –

+1

Funziona anche per percorsi relativi? Diciamo che il percorso completo è "/ var/www/html/folder_and_files_to_delete /" E lo script di cancellazione è posto in "/var/www/html/delete_folders_and_files.php". Posso semplicemente prendere "folder_and_files_to_delete" come percorso? – yoano

+0

Mi piace, la migliore risposta – mghhgm

3

È necessario aggirare il contenuto della cartella (incluso il contenuto di qualsiasi sottocartella) e rimuoverlo per primo.

C'è un esempio qui: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

Fate attenzione con esso !!!

+3

Se hai intenzione di declinare una risposta, ti preghiamo di spiegarne il motivo. – Fenton

+3

Probabilmente qualcuno qui sta cercando di elevare la loro risposta alla cima. +1 all'offset. – ryeguy

+0

Grazie ryeguy e agli altri! – Fenton

0

Si può sempre barare e fare shell_exec("rm -rf /path/to/folder");

+2

A meno che tu non sia su Windows :) –

+0

Non consigliato a tutti per la produzione. – Volomike

+2

@Volomike: perché? Questo è quasi certamente più veloce di una soluzione PHP. – ryeguy

1

Si dovrà eliminare tutti i file in modo ricorsivo. Ci sono esempi di funzioni di abbondanza nei commenti della pagina rmdir manuale:

http://www.php.net/rmdir

+0

spero che rmdir cancellerà solo la cartella che non ha contenuti. se ha contenuti non cancellerà la cartella. – Fero

+0

Proprio così Fero - rmdir non rimuoverà una directory che ha contenuti, motivo per cui è necessario eliminare prima qualsiasi contenuto se si vuole eliminare una directory (incluso il contenuto di qualsiasi sottodirectory) – Fenton

1

Non esiste un'unica funzione integrata in PHP che permetterebbe questo, è necessario scrivere il proprio con rmdir e scollegare.

Un esempio (preso da un commento su php.net docs):

<? 
// ensure $dir ends with a slash 
function delTree($dir) { 
    $files = glob($dir . '*', GLOB_MARK); 
    foreach($files as $file){ 
     if(substr($file, -1) == '/') 
      delTree($file); 
     else 
      unlink($file); 
    } 
    rmdir($dir); 
} 
?> 
+1

Che cos'è GLOB_MARK? – Randell

+0

@Randell: GLOB_MARK - Aggiunge una barra a ciascuna directory restituita. –

3

Ecco uno script che farà proprio quello che serve:

/** 
* Recursively delete a directory 
* 
* @param string $dir Directory name 
* @param boolean $deleteRootToo Delete specified top-level directory as well 
*/ 
function unlinkRecursive($dir, $deleteRootToo) 
{ 
    if(!$dh = @opendir($dir)) 
    { 
     return; 
    } 
    while (false !== ($obj = readdir($dh))) 
    { 
     if($obj == '.' || $obj == '..') 
     { 
      continue; 
     } 

     if ([email protected]($dir . '/' . $obj)) 
     { 
      unlinkRecursive($dir.'/'.$obj, true); 
     } 
    } 

    closedir($dh); 

    if ($deleteRootToo) 
    { 
     @rmdir($dir); 
    } 

    return; 
} 

ho presa da php.net e funziona .

-3

Forse un approccio migliore è utilizzare rm (se si è sotto linux). Sarebbe andare qualcosa come questo ($root dovrebbe sempre essere impostato per la vostra TMP directory per evitare l'eliminazione di file vitali!):

function remove($dir) { 

    $root = $_SERVER['DOCUMENT_ROOT'].'/tmp/'; 

    if (is_dir($root.$dir)) { 

     exec('rm -rf '.$root.$dir); 

    } 

} 
+4

remove ("/") ... renderà tutto felice :) –

+3

Yikes. I comandi della shell dovrebbero essere evitati. – Volomike

+1

L'ELIMINAZIONE DI FILE COME IN UN'APP WEB DEVE ESSERE EVITATA. DARE PERCORSI RELATIVI PU DEL CANCELLARE QUALSIASI FILE NEL SISTEMA SE L'UTENTE APP HA AUTORIZZATO. – ArunaFromLK

Problemi correlati