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

PHP 遞歸刪除空目錄與空子目錄:scandir + rmdir 實作

     編輯:PHP 綜合知識

演算法邏輯

  1. 遞歸遍歷目錄樹 (深度優先)。
  2. 對每個子目錄,遞歸處理後檢查 count(scandir($dir)) === 2 (僅含 . 和 ..)。
  3. 若為空目錄,呼叫 rmdir() 刪除。

PHP 實作

<?php
function rm_empty_dir($path) {
    if (!is_dir($path) || !($handle = opendir($path))) return;

    while (($file = readdir($handle)) !== false) {
        if ($file === '.' || $file === '..') continue;
        $cur = $path . '/' . $file;
        if (is_dir($cur)) {
            rm_empty_dir($cur); // 先處理子目錄
            if (count(scandir($cur)) === 2) {
                rmdir($cur);
                echo "Deleted empty dir: $cur\n";
            }
        }
    }
    closedir($handle);
}

// 使用
rm_empty_dir('/target/folder');

Shell 一行指令 (更高效)

find /target/folder -mindepth 1 -depth -type d -empty -exec rmdir {} \;
  • -mindepth 1:不刪除起始目錄本身。
  • -depth:深度優先 (先處理子目錄)。
  • -type d -empty:僅匹配空目錄。
  • -exec rmdir {} \;:執行刪除。

效能與安全考量

維度PHP 遞歸Shell find
跨平台✅ Windows/Linux 通用❌ 需 Unix 環境
大量目錄遞歸深度受限、較慢✅ C 底層、極快
權限控制PHP 進程權限Shell 使用者權限
錯誤處理可捕獲例外、記錄日誌需重導向 stderr

進階:保留特定目錄 (如 .git、vendor)

function rm_empty_dir_ex($path, array $preserve = ['.git','vendor','node_modules']) {
    $base = basename($path);
    if (in_array($base, $preserve)) return;
    // ... 同前邏輯
}

結語

PHP 遞歸 scandir + rmdir 邏輯清晰、跨平台,適合應用層整合;Shell find -empty -exec rmdir 效能極佳,適合維護腳本、CI/CD 清理階段。根據執行環境與需求選擇即可。

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