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);
}
dirname($dir)// 直接使用 recursive 參數,一行搞定
mkdir('/path/to/deep/nested/dir', 0777, true);
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' => '目錄建立失敗,請檢查權限'];
}