2009-08-26 78 views
27

我需要刪除的文件夾使用PHP內容的內容的文件夾。 rmdir()unlink()刪除空文件夾,但不能刪除具有文件夾的內容。如何刪除使用PHP

+6

@@ Maerlyn:我已爲這個問題上8月26日2009年,你提到的一個副本發佈於2010年7月28日..我相信你知道現在要做什麼...在做某事之前,請交叉檢查一次。 – Fero 2015-01-21 08:53:33

回答

80

該功能將允許你刪除任何文件夾(只要它是可寫的),它的文件和子目錄。

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; 
} 

使用或不使用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

偉大的方法,人。我使用的是非常簡單的命令: <?php system(「rm -r RESOURCE_PATH」); ?>,但不幸的是一些服務器不允許系統命令,所以你(我選擇了第一個)是一個非常好的簡單替換。謝了,兄弟。 – 2014-10-20 20:51:01

+1

這是否也適用於相對路徑?因此我們假設完整路徑是「/ var/www/html/folder_and_files_to_delete /」並且刪除腳本位於「/var/www/html/delete_folders_and_files.php」中。我可以將「folder_and_files_to_delete」作爲路徑嗎? – yoano 2016-03-31 17:59:43

+0

頂一下,最佳答案 – mghhgm 2017-06-16 19:33:15

0

你總是可以欺騙和做 shell_exec("rm -rf /path/to/folder");

+2

除非你使用的是Windows :) – 2009-08-26 12:45:46

+0

不建議在所有的生產。 – Volomike 2012-04-20 06:53:29

+2

@Volomike:爲什麼?這幾乎肯定比php解決方案更快。 – ryeguy 2012-04-27 02:49:10

1

你將不得不遞歸刪除所有文件。有在rmdir手冊頁的評論很多功能。例如:

http://www.php.net/rmdir

+0

我希望命令rmdir將只刪除其沒有內容的文件夾。如果它有內容,它不會刪除該文件夾。 – Fero 2009-08-26 13:36:05

+0

完全正確Fero - rmdir不會刪除包含內容的目錄,這就是爲什麼如果要刪除目錄(包括任何子目錄的內容),首先需要刪除任何內容的原因 – Fenton 2009-08-27 07:30:12

1

沒有單一的功能建設成PHP,將允許這一點,你必須寫自己與命令rmdir及取消。

一個例子(從評論採取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

什麼是GLOB_MARK? – Randell 2009-08-26 12:48:47

+0

@Randell:GLOB_MARK - 爲每個返回的目錄添加一個斜槓。 – 2009-08-26 12:55:13

3

這裏有一個腳本,只是你需要什麼:

/** 
* 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; 
} 

我從php.net得到它,它的工作原理。

-3

也許是更好的辦法是使用rm(如果你在linux下)。它會去這樣的事情($root應始終設置你的TMP directory防止刪除重要文件!):

function remove($dir) { 

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

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

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

    } 

} 
+4

刪除(「/」)...將使所有的開心:) – 2012-03-10 20:07:10

+3

哎呀。應該避免使用Shell命令。 – Volomike 2012-04-20 06:53:00

+1

在WEB應用程序中刪除這樣的文件必須避免。如果應用程序用戶擁有權限,則提供相對路徑可以刪除系統中的任何文件。 – ArunaFromLK 2015-12-23 23:54:14