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

PHP 遞歸創建多級目錄:mkdir 與 mkdirs 完整方案

     編輯:PHP 相關知識

問題背景

PHP mkdir() 單層創建目錄,若父目錄不存在則失敗。PHP 5+ 新增 recursive 參數可一鍵遞歸創建,但 PHP 4 環境或需自定義邏輯時,需手動實現。

方案一:PHP 5 內置遞歸參數(推薦)

mkdir('/path/to/deep/dir', 0777, true); // 第三參數 recursive=true

簡潔高效,無需額外代碼。

方案二:自定義遞歸函數 mkdirs(兼容 PHP 4/5)

版本 A:標準遞歸寫法

function mkdirs($dir, $mode = 0777) {
    if (is_dir($dir) || @mkdir($dir, $mode)) return true;
    if (!mkdirs(dirname($dir), $mode)) return false;
    return @mkdir($dir, $mode);
}

邏輯:檢查是否存在 → 嘗試創建 → 失敗則遞歸創建父目錄 → 再次創建當前目錄。

版本 B:極簡單行寫法(推薦)

function create_folders($dir) {
    return is_dir($dir) || (create_folders(dirname($dir)) && mkdir($dir, 0777));
}

利用短路求值:目錄存在直接返回真;否則遞歸創建父目錄成功後創建自身。

方案三:手動遍歷路徑分段創建

function mkdir_r($dirName, $rights = 0777) {
    $dirs = explode('/', $dirName);
    $dir = '';
    foreach ($dirs as $part) {
        $dir .= $part . '/';
        if (!is_dir($dir) && strlen($dir) > 0) mkdir($dir, $rights);
    }
}

將路徑按 / 分割,逐級創建,邏輯直觀,適合需要精細控制權限的場景。

對比總結

方案優點缺點適用場景
內置 recursive原生、性能最優、代碼最少需 PHP 5.0+現代項目首選
mkdirs 遞歸函數兼容舊版本、邏輯清晰遞歸深度受限、錯誤抑制需謹慎歷史項目維護
create_folders 單行版極簡、利用短路特性可讀性稍弱追求代碼簡潔
遍歷分段創建可控性強、易加入日誌/權限邏輯代碼較長複雜權限場景

最佳實踐建議

  1. 優先使用 mkdir($path, 0777, true)。
  2. 舊環境採用 create_folders,簡潔且無副作用。
  3. 創建後統一 chmod($dir, 0777) 確保權限(Windows 忽略 mode)。
  4. 生產環境避免 0777,按最小權限原則設置(如 0755)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved