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

PHP 遞迴建立多層目錄與刪除非空目錄的實用函數

     編輯:PHP 相關知識

遞迴建立目錄 mkdirs()

<?php
function mkdirs($dir) {
    if (is_dir($dir)) return true;
    // 先確保父目錄存在
    if (!mkdirs(dirname($dir))) return false;
    // 建立當前目錄,權限 0777 受 umask 影響
    return @mkdir($dir, 0777, true); // PHP 5.0+ 支援 recursive 參數,單行即可
}

// 使用範例
mkdirs('div/css/layout'); // 自動建立 div -> css -> layout
?>

注意:PHP 5.0 以上 mkdir($path, 0777, true) 內建遞迴建立,無需自寫函數。舊版本才需自行遞迴。

遞迴刪除非空目錄 rmdirs()

<?php
function rmdirs($dir) {
    if (!is_dir($dir)) return false;
    $items = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    foreach ($items as $item) {
        if ($item->isDir()) {
            @rmdir($item->getPathname());
        } else {
            @unlink($item->getPathname());
        }
    }
    return @rmdir($dir);
}

// 使用範例
rmdirs('div/css/layout'); // 連同所有子目錄檔案一併刪除
?>

現代化寫法(PHP 5.3+)

利用 SPL RecursiveDirectoryIterator + RecursiveIteratorIterator::CHILD_FIRST 由深至淺刪除,程式碼更簡潔、效能更好,避免手寫遞迴可能造成的堆疊溢位。

舊版相容寫法(PHP 4/早期 5)

function rmdirs_legacy($dir) {
    $handle = @opendir($dir);
    if (!$handle) return false;
    while (($file = @readdir($handle)) !== false) {
        if ($file === '.' || $file === '..') continue;
        $path = $dir . '/' . $file;
        is_dir($path) ? rmdirs_legacy($path) : @unlink($path);
    }
    closedir($handle);
    return @rmdir($dir);
}

權限與錯誤處理提醒

  • 執行 PHP 的使用者需具備目標目錄的寫入/刪除權限。
  • 建議在刪除前加入確認機制或備份,避免誤刪重要資料。
  • 生產環境請移除 @ 抑制錯誤,改用 try-catch 或檢查回傳值並記錄日誌。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved