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'); // 連同所有子目錄檔案一併刪除
?>
利用 SPL RecursiveDirectoryIterator + RecursiveIteratorIterator::CHILD_FIRST 由深至淺刪除,程式碼更簡潔、效能更好,避免手寫遞迴可能造成的堆疊溢位。
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);
}
@ 抑制錯誤,改用 try-catch 或檢查回傳值並記錄日誌。