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

PHP 刪除目錄三大方法:遞迴、系統指令與迴圈遞迴完整比較

     編輯:PHP 綜合知識

刪除非空目錄是常見需求。本文整理三種 PHP 實作方式,分析優缺點與適用場景,附上可直接使用的函式代碼。

方法一:遞迴函式(標準做法)

function deleteDir($dir) {
    if (!is_dir($dir)) return false;
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') continue;
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        is_dir($path) ? deleteDir($path) : unlink($path);
    }
    return rmdir($dir);
}
  • ✅ 跨平台、無外部依賴、可精細控制錯誤處理。
  • ⚠️ 深層目錄可能觸發遞迴深度限制(可用 ini_set('xdebug.max_nesting_level', 500) 緩解)。

方法二:系統指令(最快但有風險)

function del_dir($dir) {
    $dir = escapeshellarg($dir); // 必須跳脫防注入
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        return exec("rmdir /s /q {$dir}");
    } else {
        return exec("rm -rf {$dir}");
    }
}
  • ✅ 效能最好,適合超大目錄樹。
  • ❌ 極度危險:路徑注入風險、依賴作業系統指令、需 exec 權限、Windows/Linux 行為差異。
  • ⚠️ 僅限受控環境、經過嚴格路徑驗證後使用。

方法三:迴圈 + 遞迴(手動堆疊)

function deltree($pathdir) {
    if (!is_dir($pathdir)) return false;
    $stack = [$pathdir];
    while ($stack) {
        $current = array_pop($stack);
        $items = scandir($current);
        foreach ($items as $item) {
            if ($item === '.' || $item === '..') continue;
            $path = $current . DIRECTORY_SEPARATOR . $item;
            if (is_dir($path)) {
                $stack[] = $path; // 目錄稍後處理
            } else {
                unlink($path);    // 檔案立即刪除
            }
        }
        // 子目錄清空後刪除目錄本身
        @rmdir($current);
    }
    return true;
}
  • ✅ 避免遞迴深度限制、記憶體較穩定。
  • ✅ 邏輯清晰,易於加入進度回呼或權限檢查。

效能與選擇建議

場景推薦方法理由
一般專案、中小目錄方法一(遞迴)代碼簡潔、跨平台、易維護
超大目錄(百萬檔案以上)方法三(堆疊)避免堆疊溢位、記憶體可控
臨時清理、受控腳本方法二(系統指令)速度最快,但需極謹慎使用

通用輔助函式:判斷空目錄

function is_empty_dir($dir) {
    $handle = opendir($dir);
    $count = 0;
    while (($entry = readdir($handle)) !== false) {
        if ($entry !== '.' && $entry !== '..') { $count++; break; }
    }
    closedir($handle);
    return $count === 0;
}

實務上建議封裝為工具類,統一錯誤處理、日誌記錄與權限檢查,避免誤刪關鍵資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved