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

PHP 一行代碼刪除目錄下所有檔案與子目錄

     編輯:PHP 相關知識

PHP 一行代碼刪除目錄下所有檔案與子目錄

利用 PHP 內建函數組合,可以用極簡潔的代碼實現遞迴刪除目錄內容。本文解析 array_map、glob、array_filter 的組合技巧,並提供更健壯的遞迴刪除函數供生產環境使用。

極簡版 (僅限當前目錄非遞迴子目錄)

<?php
// 刪除當前目錄下所有「檔案」
array_map('unlink', array_filter(glob('*'), 'is_file'));

// 刪除當前目錄下所有「空目錄」
array_map('rmdir', glob('*', GLOB_ONLYDIR));

原理解析

  1. glob('*'):取得當前目錄下所有檔案/目錄名稱陣列。
  2. array_filter(..., 'is_file'):過濾出檔案 (非目錄)。
  3. array_map('unlink', ...):對每個檔案名稱執行 unlink 刪除。
  4. glob('*', GLOB_ONLYDIR):直接只取得目錄名稱。
  5. array_map('rmdir', ...):對每個目錄執行 rmdir (僅能刪除空目錄)。

⚠️ 重要限制

  • 非遞迴: 只處理指定目錄第一層,子目錄中的檔案不會被刪除。
  • 非空目錄無法刪除: rmdir 要求目錄為空。
  • 錯誤處理: 若權限不足或檔案被佔用,unlink/rmdir 會產生 Warning,且無法捕獲具體失敗項目。

生產環境推薦:健壯的遞迴刪除函數

<?php
/**
 * 遞迴刪除目錄及其所有內容 (檔案 + 子目錄)
 * @param string $dir 目標目錄路徑
 * @param bool $deleteSelf 是否刪除目標目錄本身 (預設 true)
 * @return bool 成功返回 true,失敗拋出異常
 */
function recursiveDelete(string $dir, bool $deleteSelf = true): bool {
    if (!is_dir($dir)) {
        throw new InvalidArgumentException("$dir 不是有效目錄");
    }
    
    $items = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST // 關鍵:先刪除子項,再刪除父目錄
    );
    
    foreach ($items as $item) {
        $path = $item->getPathname();
        if ($item->isFile() || $item->isLink()) {
            if (!@unlink($path)) {
                throw new RuntimeException("無法刪除檔案: $path");
            }
        } elseif ($item->isDir()) {
            if (!@rmdir($path)) {
                throw new RuntimeException("無法刪除目錄: $path");
            }
        }
    }
    
    if ($deleteSelf) {
        if (!@rmdir($dir)) {
            throw new RuntimeException("無法刪除根目錄: $dir");
        }
    }
    return true;
}

// 使用範例
try {
    recursiveDelete('/path/to/cache'); // 刪除 cache 目錄及其所有內容
    echo "刪除成功";
} catch (Exception $e) {
    echo "刪除失敗: " . $e->getMessage();
}
?>

進階技巧

  • 效能優化: 大量檔案刪除時,考慮使用系統命令 exec('rm -rf ' . escapeshellarg($dir)) (Linux) 或 exec('rd /s /q ' . escapeshellarg($dir)) (Windows),速度快數個數量級。
  • 權限處理: 刪除前可嘗試 chmod($path, 0777) 提升權限。
  • 垃圾桶機制: 重要資料建議先移動到暫存區,而非直接刪除。

「一行代碼」適合快速腳本或單元測試清理,正式專案請使用具備錯誤處理、遞迴支援、日誌記錄的健壯函數。

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