2011-10-07 19 views
5

Ho scritto la funzione PHP ricorsiva per l'eliminazione delle cartelle. Mi chiedo, come posso modificare questa funzione per eliminare tutti i file e le cartelle nel webhosting, escludendo una serie di file e nomi di cartelle (ad esempio cgi-bin, .htaccess)?Funzione di cancellazione ricorsiva PHP

BTW

Per utilizzare questa funzione per rimuovere completamente una directory chiamata come questo

recursive_remove_directory('path/to/directory/to/delete'); 

utilizzare questa funzione per svuotare una directory chiamata come questo:

recursive_remove_directory('path/to/full_directory',TRUE); 

Ora la funzione è

function recursive_remove_directory($directory, $empty=FALSE) 
{ 
    // if the path has a slash at the end we remove it here 
    if(substr($directory,-1) == '/') 
    { 
     $directory = substr($directory,0,-1); 
    } 

    // if the path is not valid or is not a directory ... 
    if(!file_exists($directory) || !is_dir($directory)) 
    { 
     // ... we return false and exit the function 
     return FALSE; 

    // ... if the path is not readable 
    }elseif(!is_readable($directory)) 
    { 
     // ... we return false and exit the function 
     return FALSE; 

    // ... else if the path is readable 
    }else{ 

     // we open the directory 
     $handle = opendir($directory); 

     // and scan through the items inside 
     while (FALSE !== ($item = readdir($handle))) 
     { 
      // if the filepointer is not the current directory 
      // or the parent directory 
      if($item != '.' && $item != '..') 
      { 
       // we build the new path to delete 
       $path = $directory.'/'.$item; 

       // if the new path is a directory 
       if(is_dir($path)) 
       { 
        // we call this function with the new path 
        recursive_remove_directory($path); 

       // if the new path is a file 
       }else{ 
        // we remove the file 
        unlink($path); 
       } 
      } 
     } 
     // close the directory 
     closedir($handle); 

     // if the option to empty is not set to true 
     if($empty == FALSE) 
     { 
      // try to delete the now empty directory 
      if(!rmdir($directory)) 
      { 
       // return false if not possible 
       return FALSE; 
      } 
     } 
     // return success 
     return TRUE; 
    } 
} 
+0

Vedere http://trac.symfony-project.org/browser/branches/1.4/lib/util/sfToolkit.class.php#L54 per un'implementazione esistente. –

risposta

4

provare qualcosa di simile:

$it = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('%yourBaseDir%'), 
    RecursiveIteratorIterator::CHILD_FIRST 
); 

$excludeDirsNames = array(); 
$excludeFileNames = array('.htaccess'); 

foreach($it as $entry) { 
    if ($entry->isDir()) { 
    if (!in_array($entry->getBasename(), $excludeDirsNames)) { 
     try { 
     rmdir($entry->getPathname()); 
     } 
     catch (Exception $ex) { 
     // dir not empty 
     } 
    } 
    } 
    elseif (!in_array($entry->getFileName(), $excludeFileNames)) { 
    unlink($entry->getPathname()); 
    } 
} 
+0

La mia directory di base è la cartella www e il file con questa funzione si troverà nella cartella www. Cosa sarà '% yourBaseDir%'? farà anche la cancellazione della cartella ricorsiva? e come trattare con .htaccess? – heron

+0

La mia directory di base è la cartella www e il file con questa funzione si troverà nella cartella www. Cosa sarà% yourBaseDir%? Voglio dire che la funzione deve cancellare tutti i file e le cartelle nella cartella corrente ed escludere gli array, e se stesso – heron

+0

Ottenere errori: 'Directory non vuota on line rmdir ($ entry-> getPathname()); ' – heron

0
  1. si potrebbe fornire un parametro in più serie $exclusions-recursive_remove_directory(), ma si dovrà passare questo parametro ogni volta in modo ricorsivo.

  2. Marca $exclusions globale. In questo modo è possibile accedervi in ​​ogni livello di ricorsione.

+0

si prega di applicare la propria idea al codice dato – heron

0

sto usando questa funzione per eliminare la cartella con tutti i file e sottocartelle:

function removedir($dir) { 
    if (substr($dir, strlen($dir) - 1, 1) != '/') 
     $dir .= '/'; 
    if ($handle = opendir($dir)) { 
     while ($obj = readdir($handle)) { 
      if ($obj != '.' && $obj != '..') { 
       if (is_dir($dir . $obj)) { 
        if (!removedir($dir . $obj)) 
         return false; 
       } 
       else if (is_file($dir . $obj)) { 
        if (!unlink($dir . $obj)) 
         return false; 
       } 
      } 
     } 
     closedir($handle); 
     if ([email protected]($dir)) 
      return false; 
     return true; 
    } 
    return false; 
} 

$folder_to_delete = "folder"; // folder to be deleted 

echo removedir($folder_to_delete) ? 'done' : 'not done'; 

IIRC ho ricevuto questo da php.net

Problemi correlati