`rmdir()` 僅能刪除**空目錄**。本文說明基本用法、判斷目錄存在、遞歸刪除非空目錄完整實作、權限問題與最佳實踐。
bool rmdir ( string $dirname [, resource $context ] )
成功返回 `true`,失敗返回 `false`(目錄不存在、非空、權限不足)。
<?php
$dir = 'exampledir';
if (!is_dir($dir)) {
mkdir($dir); // 建立測試用
echo "目錄已建立\n";
}
if (rmdir($dir)) {
echo "目錄刪除成功\n";
} else {
echo "刪除失敗:目錄不存在、非空或無權限\n";
}
?>
<?php
/**
* 遞歸刪除目錄及其所有內容
* @param string $dir 目錄路徑
* @return bool 是否成功
*/
function deleteDirectory($dir) {
if (!is_dir($dir)) {
return false;
}
$items = scandir($dir);
foreach ($items as $item) {
if ($item === '.' || $item === '..') continue;
$path = $dir . DIRECTORY_SEPARATOR . $item;
if (is_dir($path)) {
deleteDirectory($path); // 遞歸刪除子目錄
} else {
if (!unlink($path)) { // 刪除檔案
return false;
}
}
}
return rmdir($dir); // 最後刪除空目錄
}
// 使用
$targetDir = './fakeDir';
if (deleteDirectory($targetDir)) {
echo "目錄及內容已完全刪除\n";
} else {
echo "刪除過程中發生錯誤\n";
}
?>
function deleteDirectorySpl($dir) {
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST // 先刪除子項
);
foreach ($iterator as $item) {
if ($item->isDir()) {
rmdir($item->getPathname());
} else {
unlink($item->getPathname());
}
}
rmdir($dir);
}
| 錯誤 | 原因 | 解決 |
|---|---|---|
| Permission denied | PHP 進程無寫入權限 | 確認目錄擁有者/群組、chmod 755、SELinux/AppArmor |
| Directory not empty | 直接對非空目錄調用 rmdir | 使用遞歸刪除函數 |
| No such file or directory | 路徑錯誤或已被刪除 | 先 `is_dir()` 判斷 |
| Device or resource busy | 目錄被其他進程鎖定 | 關閉佔用程式、lsof 排查 |
掌握 `rmdir` 限制與遞歸刪除模式,能安全處理各類目錄清理需求。