如何在 PHP 中遞迴刪除目錄及其所有內容(檔案 + 子目錄)


PHP:PHP(超文字預處理器)是一種廣泛使用的開源伺服器端指令碼語言,專門為 Web 開發而設計。它最初由 Rasmus Lerdorf 於 1994 年建立,此後發展成為一種功能強大的語言,被全球數百萬開發人員使用。

PHP 主要用於開發動態網頁和 Web 應用程式。它允許開發人員在 HTML 中嵌入 PHP 程式碼,從而輕鬆地將伺服器端邏輯與表示層混合在一起。PHP 指令碼在伺服器上執行,生成的 HTML 傳送到客戶端的瀏覽器。

有多種方法可以在 PHP 中遞迴刪除目錄及其所有內容(檔案和子目錄)。以下是三種常見方法

  • 使用 rmdir() 和 unlink() 函式遞迴刪除

  • 使用 glob() 函式

  • 使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 類

使用 rmdir() 和 unlink() 函式遞迴刪除

要使用 PHP 中的 rmdir() 和 unlink() 函式遞迴刪除目錄及其所有內容(檔案和子目錄),

示例

<?php
function deleteDirectory($dirPath) {
   if (is_dir($dirPath)) {
      $files = scandir($dirPath);
      foreach ($files as $file) {
         if ($file !== '.' && $file !== '..') {
            $filePath = $dirPath . '/' . $file;
            if (is_dir($filePath)) {
               deleteDirectory($filePath);
            } else {
               unlink($filePath);
            }
         }
      }
      rmdir($dirPath);
   }
}
?>

程式碼解釋

定義了 deleteDirectory() 函式,該函式以目錄路徑作為引數。

它使用 is_dir($dirPath) 檢查給定路徑是否為目錄。如果不是目錄,則函式返回。

如果是目錄,則它使用 scandir($dirPath) 檢索指定目錄中檔案和目錄的列表。

它遍歷每個檔案和目錄,排除特殊條目 "." 和 ".."。

對於每個條目,它透過連線目錄路徑和檔名來構造完整的檔案路徑。

如果條目是子目錄,則遞迴呼叫 deleteDirectory() 函式。

如果條目是檔案,則使用 unlink($filePath) 刪除檔案。

處理完所有檔案和子目錄後,呼叫 rmdir($dirPath) 刪除空目錄本身。

要使用此函式,只需使用要刪除的目錄的路徑呼叫它即可

<?php
   $directoryPath = '/path/to/directory';
   deleteDirectory($directoryPath);
?>

確保您具有刪除指定路徑中檔案和目錄的適當許可權。

使用 glob() 函式

要使用 PHP 中的 glob() 函式遞迴刪除目錄及其所有內容(檔案和子目錄),

示例

<?php
function deleteDirectory($dirPath) {
   $files = glob($dirPath . '/*');
   foreach ($files as $file) {
      if (is_dir($file)) {
         deleteDirectory($file);
      } else {
         unlink($file);
      }
   }
   rmdir($dirPath);
}
?>

程式碼解釋

定義了 deleteDirectory() 函式,該函式以目錄路徑作為引數。

它使用 glob() 函式以及模式 $dirPath . '/*' 檢索指定目錄中檔案和目錄的列表。

它遍歷從 glob() 獲得的每個條目。

對於每個條目,它使用 is_dir($file) 檢查它是否為目錄。

如果是目錄,則遞迴呼叫 deleteDirectory() 函式以刪除其內容。

如果是檔案,則使用 unlink($file) 刪除檔案。

處理完所有檔案和子目錄後,呼叫 rmdir($dirPath) 刪除空目錄本身。

要使用此函式,只需使用要刪除的目錄的路徑呼叫它即可

<?php
$directoryPath = '/path/to/directory';
deleteDirectory($directoryPath);
?>

確保您具有刪除指定路徑中檔案和目錄的適當許可權。

使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 類

要使用 PHP 中的 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 類遞迴刪除目錄及其所有內容(檔案和子目錄),

示例

<?php
function deleteDirectory($dirPath) {
   $iterator = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator($dirPath, 
RecursiveDirectoryIterator::SKIP_DOTS),
      RecursiveIteratorIterator::CHILD_FIRST
   );
   foreach ($iterator as $file) {
      if ($file->isDir()) {
         rmdir($file->getPathname());
      } else {
         unlink($file->getPathname());
      }
   }
     rmdir($dirPath);
}

?>

程式碼解釋

定義了 deleteDirectory() 函式,該函式以目錄路徑作為引數。

它使用指定的目錄路徑建立一個 RecursiveDirectoryIterator 物件。RecursiveDirectoryIterator::SKIP_DOTS 標誌用於從迭代中排除特殊條目 "." 和 ".."。

它建立一個 RecursiveIteratorIterator 物件以遞迴方式遍歷檔案和目錄。RecursiveIteratorIterator::CHILD_FIRST 標誌用於確保在父元素之前處理子元素。

它使用 $iterator 上的 foreach 迴圈遍歷每個檔案和目錄。

對於每個條目,它使用 $file->isDir() 檢查它是否為目錄。

如果是目錄,則使用 rmdir($file->getPathname()) 刪除目錄。

如果是檔案,則使用 unlink($file->getPathname()) 刪除檔案。

處理完所有檔案和子目錄後,呼叫 rmdir($dirPath) 刪除空目錄本身。

要使用此函式,只需使用要刪除的目錄的路徑呼叫它即可

<?php
   $directoryPath = '/path/to/directory';
   deleteDirectory($directoryPath);
?>

確保您具有刪除指定路徑中檔案和目錄的適當許可權。

結論

這些方法提供了實現相同結果的不同方法。您可以選擇適合您特定需求和編碼偏好的方法。請記住正確處理許可權,以確保您擁有刪除檔案和目錄的必要許可權。

更新時間: 2023年8月1日

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告