2011-10-07 39 views
5

Tôi đã viết hàm đệ quy PHP để xóa thư mục. Tôi tự hỏi, làm cách nào để sửa đổi chức năng này để xóa tất cả các tệp và thư mục trong webhosting, không bao gồm mảng tệp và tên thư mục đã cho (ví dụ: cgi-bin, .htaccess)?Chức năng xóa đệ quy PHP

BTW

để sử dụng chức năng này để hoàn toàn loại bỏ một thư mục gọi như thế này

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

để sử dụng chức năng này để trống một thư mục gọi như thế này:

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

Bây giờ chức năng là

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

Xem http://trac.symfony-project.org/browser/branches/1.4/lib/util/sfToolkit.class.php#L54 để triển khai hiện tại. –

Trả lời

4

Hãy thử một cái gì đó như thế này:

$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

Thư mục cơ sở của tôi là thư mục www và tệp có chức năng này sẽ nằm trong thư mục www.What sẽ là '% yourBaseDir%'? nó sẽ làm toàn bộ thư mục đệ quy xóa quá ?? và cách xử lý .htaccess? – heron

+0

Thư mục cơ bản của tôi là thư mục www và tệp có chức năng này sẽ nằm trong thư mục www.What sẽ là% yourBaseDir%? Tôi có nghĩa là chức năng phải xóa tất cả các tập tin và thư mục trong thư mục hiện hành và loại trừ mảng, và chính nó – heron

+0

Bắt lỗi: 'Thư mục không trống trên dòng rmdir ($ entry-> getPathname()); ' – heron

0
  1. Bạn có thể cung cấp thông số mảng bổ sung $exclusions đến recursive_remove_directory(), nhưng bạn sẽ phải chuyển thông số này mỗi lần đệ quy.

  2. Làm cho $exclusions toàn cầu. Bằng cách này, nó có thể được truy cập ở mọi cấp độ đệ quy.

+0

hãy áp dụng ý tưởng của bạn cho mã số – heron

0

Tôi đang sử dụng chức năng này để xóa các thư mục với tất cả các file và thư mục con:

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 Tôi nhận này từ php.net