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

PHP mkdir() 建立多層目錄完整指南:遞迴建立與刪除實作

     編輯:PHP 相關知識

前言

mkdir() 預設僅建立單層目錄,若父目錄不存在會失敗。本文詳細說明 mkdir() 參數、遞迴建立多層目錄的自訂函式實作、以及對應的遞迴刪除目錄函式。

mkdir() 參數說明

mkdir(string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null): bool
  • $directory:目錄路徑。
  • $permissions:權限模式 (八進位),預設 0777 (受 umask 影響)。
  • $recursive:PHP 5.0.0+ 設為 true 可自動建立父目錄,強烈建議直接使用此參數。
  • $context:串流上下文。

現代寫法:直接啟用 recursive 參數 (PHP 5+)

<?php
// 一行搞定多層目錄建立
mkdir('div/css/layout', 0777, true); // true = recursive
?>

這是官方推薦、最高效、最簡潔的做法,無需自寫遞迴函式。

舊版 PHP 或教學用:自訂遞迴建立函式

<?php
/**
 * 相容舊版 PHP 的多層目錄建立 (PHP 4 風格)
 */
function mkdirs(string $dir, int $mode = 0777): bool {
    if (is_dir($dir)) return true;
    // 遞迴建立父目錄
    $parent = dirname($dir);
    if ($parent !== '.' && $parent !== '/' && !mkdirs($parent, $mode)) {
        return false;
    }
    return @mkdir($dir, $mode); // @ 抑制已存在警告
}

// 使用
mkdirs('div/css/layout');

遞迴刪除目錄與檔案

<?php
/**
 * 遞迴刪除目錄及其所有內容
 */
function rmdirs(string $dir): bool {
    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');

優點:使用 SPL 迭代器 CHILD_FIRST 確保先刪除子項再刪除父目錄,程式碼簡潔無手寫遞迴 Bug 風險。

舊版手寫遞迴刪除 (參考)

function rmdirs_legacy($dir) {
    $d = dir($dir);
    while (false !== ($child = $d->read())) {
        if ($child !== '.' && $child !== '..') {
            $path = $dir . DIRECTORY_SEPARATOR . $child;
            is_dir($path) ? rmdirs_legacy($path) : unlink($path);
        }
    }
    $d->close();
    return rmdir($dir);
}

權限與安全注意事項

  • 目錄權限 0777 受 umask 影響,實際權限通常為 0755 (目錄) / 0644 (檔案)。
  • Web 伺服器執行身分 (如 www-data) 必須對父目錄有寫入權限。
  • 避免使用者輸入直接拼接路徑,防止目錄遍歷攻擊:
    $safe = basename($input); mkdir("/var/www/uploads/$safe", 0755, true);
  • 生產環境建議關閉 PHP 錯誤顯示,改用錯誤日誌,避免路徑洩露。

總結

PHP 5.0+ 直接使用 mkdir($path, 0777, true) 即可建立多層目錄,簡潔高效。刪除目錄樹推薦使用 SPL RecursiveIteratorIterator::CHILD_FIRST 模式,程式碼極短且正確。舊版相容或教學需求可參考手寫遞迴實作。

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