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

PHP 遞歸建立多層目錄實作:mkdir 與 dirname 結合的經典技巧

     編輯:PHP 綜合知識

PHP 建立多層目錄的遞歸函數

PHP 內建 mkdir() 預設不支援遞歸建立目錄(PHP 5.0.0+ 可透過第三參數 recursive=true 實現),但在舊版本或需要自訂邏輯時,遞歸函數是經典解法。

遞歸建立目錄函數

function mk_dir($dir, $mode = 0777) {
    // 若目錄已存在或成功建立,回傳 true
    if (is_dir($dir) || mkdir($dir, $mode)) {
        return true;
    }

    // 否則遞歸建立父目錄
    if (!mk_dir(dirname($dir), $mode)) {
        return false;
    }

    // 父目錄就緒後,再次嘗試建立當前目錄
    return mkdir($dir, $mode);
}

運作原理解析

  1. 檢查目標目錄是否存在,存在則直接回傳成功
  2. 嘗試直接建立,成功則回傳
  3. 失敗則遞歸呼叫自身建立父目錄 dirname($dir)
  4. 父目錄建立成功後,再次嘗試建立原目標目錄

現代 PHP 簡寫法(PHP 5.0.0+)

// 直接使用 recursive 參數,一行搞定
mkdir('/path/to/deep/nested/dir', 0777, true);

使用建議

  • **PHP 5.0+ 專案**:直接使用內建 mkdir($path, $mode, true)
  • **舊版本維護或需自訂邏輯**:使用遞歸函數
  • **權限設定**:注意 $mode 在 Windows 系統下會被忽略,實際權限受限於檔案系統與伺服器設定
  • **錯誤處理**:生產環境建議加入 @ 抑制警告或使用 try-catch 捕獲異常

進階版:帶有詳細錯誤回報的版本

function mk_dir_advanced($dir, $mode = 0777) {
    if (is_dir($dir)) {
        return ['success' => true, 'message' => '目錄已存在'];
    }

    $parent = dirname($dir);
    if ($parent !== $dir && !is_dir($parent)) {
        $result = mk_dir_advanced($parent, $mode);
        if (!$result['success']) {
            return $result;
        }
    }

    if (mkdir($dir, $mode)) {
        return ['success' => true, 'message' => '目錄建立成功'];
    }

    return ['success' => false, 'message' => '目錄建立失敗,請檢查權限'];
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved