2011-10-07 16 views
5

Napisałem funkcję rekursywnego PHP do usuwania folderów. Zastanawiam się, jak mogę zmodyfikować tę funkcję, aby usunąć wszystkie pliki i foldery w webhostingu, z wyłączeniem podanej tablicy plików i nazw folderów (np. Cgi-bin, .htaccess)?Funkcja recursive delete PHP

BTW

aby skorzystać z tej funkcji, aby całkowicie usunąć katalog nazywając jak ten

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

aby skorzystać z tej funkcji, aby opróżnić katalog nazywając tak:

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

teraz funkcja ta to

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

Zobacz http://trac.symfony-project.org/browser/branches/1.4/lib/util/sfToolkit.class.php#L54 dla istniejącej implementacji. –

Odpowiedz

4

spróbować czegoś takiego:

$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

Mój podstawowy katalog to folder www, a plik z tą funkcją będzie znajdować się w folderze www. Co to będzie '% yourBaseDir%'? to też spowoduje usunięcie całego rekurencyjnego folderu? i jak sobie poradzić z .htaccess? – heron

+0

Mój podstawowy katalog to folder www, a plik z tą funkcją będzie znajdować się w folderze www. Jaki będzie% yourBaseDir%? Chodzi mi o to, że funkcja musi usuwać wszystkie pliki i foldery w bieżącym folderze i wykluczać tablice, a sama siebie – heron

+0

Otrzymywanie błędów: 'Directory not empty on line rmdir ($ entry-> getPathname()); ' – heron

0
  1. Można zapewnić dodatkowy parametr tablicy $exclusions do recursive_remove_directory(), ale musisz zdać ten parametr za każdym razem rekurencyjnie.

  2. Ustaw jako globalną $exclusions. W ten sposób można uzyskać do niego dostęp na każdym poziomie rekurencji.

+0

proszę zastosować swój pomysł do podanego kodu – heron

0

używam tej funkcji, aby usunąć folder ze wszystkich plików i podfolderów:

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 mam to od php.net