首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 遞迴刪除整個目錄:完整實作與現代 FilesystemIterator 替代方案

     編輯:PHP 相關知識

前言

刪除非空目錄需遞迴刪除所有子檔案與子目錄。本文提供標準遞迴實作、錯誤處理、權限檢查與現代 RecursiveDirectoryIterator 替代方案。

標準遞迴函數實作

<?php
/**
 * 遞迴刪除目錄及其所有內容
 *
 * @param string $dir 目錄路徑
 * @return bool 成功返回 true,失敗拋出異常
 */
function deleteDirectory(string $dir): bool {
    // 正規化路徑
    $dir = rtrim($dir, '/\\');
    
    if (!is_dir($dir)) {
        throw new \InvalidArgumentException("Not a directory: $dir");
    }

    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
        
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        
        if (is_dir($path)) {
            deleteDirectory($path); // 遞迴刪除子目錄
        } else {
            if (!unlink($path)) {
                throw new \RuntimeException("Failed to delete file: $path");
            }
        }
    }

    if (!rmdir($dir)) {
        throw new \RuntimeException("Failed to remove directory: $dir");
    }
    return true;
}

// 使用範例
try {
    deleteDirectory('./fakeDir');
    echo "目錄刪除成功\n";
} catch (\Exception $e) {
    echo "刪除失敗: " . $e->getMessage() . "\n";
}
?>

現代替代:RecursiveDirectoryIterator(PHP 5.3+)

<?php
function deleteDirectoryModern(string $dir): void {
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST // 先刪除子項,再刪除父目錄
    );

    foreach ($files as $file) {
        if ($file->isDir()) {
            rmdir($file->getPathname());
        } else {
            unlink($file->getPathname());
        }
    }
    rmdir($dir);
}
?>

關鍵常數說明

  • RecursiveDirectoryIterator::SKIP_DOTS:自動跳過 . 和 ..。
  • RecursiveIteratorIterator::CHILD_FIRST:深度優先,子節點先於父節點處理(刪除必需)。

權限與安全檢查

  • 刪除前檢查 is_writable($dir) 與 is_writable($file)。
  • 避免刪除系統關鍵目錄:加入路徑白名單或黑名單檢查。
  • 生產環境建議先移動到暫存區(rename()),確認無誤再永久刪除。

效能比較

總結

遞迴刪除目錄核心邏輯為「深度優先刪除檔案,再刪除空目錄」。現代 RecursiveDirectoryIterator 程式碼更簡潔、自動處理 ./..、支援 CHILD_FIRST 排序,是推薦做法。希望本文對您的 PHP 程式設計有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法程式碼行數可讀性效能
遞迴函數~20直觀良好
RecursiveIterator~10宣告式略優(C 實作迭代器)