2013-08-27 103 views
0

我嘗試刪除包含大量子文件夾和文件(> 1000)的大目錄。有很多功能爲此建立,我使用以下內容:不會刪除具有'刪除遞歸目錄'功能的所有文件

function rrmdir($dir) { 
     if (is_dir($dir)) { 
      $objects = scandir($dir); 
      foreach ($objects as $object) { 
       if ($object != "." && $object != "..") { 
        if (filetype($dir . "/" . $object) == "dir"){ 
         log_message(201,array(),'Try to delete folder: '.$dir.'/'.$object); 
         rrmdir($dir . "/" . $object); 
        }else{ 
         log_message(201,array(),'Try to delete FILE: '.$dir.'/'.$object); 
         unlink($dir . "/" . $object); 
        } 
       } 
      } 
      reset($objects); 
      rmdir($dir); 
     } 
    } 

問題是,許多文件被遺留。這是通常的行爲,是我的代碼錯了嗎?如果是平常的行爲,我該如何解決這個問題?

在此先感謝。

+0

您需要檢查unlink()的返回值。在失敗時它將爲布爾值FALSE,例如沒有權限。只是因爲你可以看到一個文件並不意味着你可以刪除它。另外,你實際上並沒有刪除你找到的目錄,只是文件。 –

+0

列出每個要刪除的文件效率不高,請考慮可用於刪除的os功能 – 2013-08-27 20:24:49

+0

代碼中沒有錯誤檢查。所以你怎麼能期望everyhting工作?文件系統是獨立於腳本的系統,因此它可以獨立運行(例如,甚至可能在腳本認爲已經刪除的目錄中創建了新的文件,但它仍然運行)。 – hakre

回答

0

不同的操作手柄有所不同。在大多數操作系統中,文件系統可以鎖定文件以進行讀取或寫入操作。

如果另一個進程擁有帶鎖的文件句柄,那麼您的進程可能不會修改(或刪除)該文件。對於不同的線程也是如此。

+0

謝謝你的回答,但我不認爲這是問題所在。 – fps