刪除非空目錄需遞迴清理檔案與子目錄。本文提供兩種寫法:標準 opendir/readdir 與 scandir 簡潔版,並說明 Windows 中文路徑編碼轉換關鍵點。
function recursiveDelete($dir) {
if ($handle = @opendir($dir)) {
while (($file = readdir($handle)) !== false) {
if ($file === '.' || $file === '..') continue;
$path = $dir . '/' . $file;
if (is_dir($path)) {
recursiveDelete($path); // 遞迴刪除子目錄
} else {
@unlink($path); // 刪除檔案
}
}
@closedir($handle);
@rmdir($dir); // 刪除空目錄
}
}
function my_del($path) {
if (is_dir($path)) {
$files = scandir($path);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
my_del($path . '/' . $file);
}
@rmdir($path); // 此時目錄已空
} else {
@unlink($path);
}
}
// 使用
$target = 'd:/技術文檔 - 副本';
// Windows + PHP UTF-8 腳本刪除中文路徑需轉碼
$target = iconv('UTF-8', 'GBK', $target); // 或 'CP950'/'BIG-5'
my_del($target);
| 特性 | opendir/readdir | scandir |
|---|---|---|
| 程式碼行數 | 較多 | 極簡 |
| 記憶體 | 逐個讀取,低 | 一次載入所有檔名,大目錄較高 |
| 錯誤抑制 | 各自 @ | 統一 @ |
| PHP 版本 | 所有 | PHP 5+ |