核心技巧
// 刪除當前目錄所有檔案 (不含子目錄)
array_map('unlink', glob('*'));
// 指定目錄
array_map('unlink', glob('aaa/*'));
原理解析
| 函數 | 作用 |
glob(pattern) | 回傳符合模式的檔案/目錄陣列 (支援萬用字元 * ? []) |
unlink(filename) | 刪除單一檔案 |
array_map(callback, array) | 將陣列每個元素套用 callback 函數 |
進階變體
遞迴刪除所有檔案 (含子目錄)
function delete_all_files($dir) {
$files = glob(rtrim($dir, '/') . '/*');
foreach ($files as $file) {
is_dir($file) ? delete_all_files($file) : @unlink($file);
}
}
僅刪除特定副檔名
array_map('unlink', glob('*.log'));
array_map('unlink', glob('*.{jpg,png,gif}', GLOB_BRACE));
保留特定檔案
$keep = ['config.php', '.htaccess'];
$files = array_diff(glob('*'), $keep);
array_map('unlink', $files);
注意事項
glob() 預設不回傳隱藏檔 (以 . 開頭),需額外處理 glob('.*')。
unlink() 失敗會回傳 false 並觸發 Warning,建議加 @ 或檢查權限。
- 大量檔案 (萬筆以上) 可能超過記憶體/執行時間限制,建議分批處理或使用
DirectoryIterator。
- 極度危險:請三次確認路徑,避免誤刪專案核心檔案。
效能比較
// 方法 1: array_map + glob (簡潔,適合中小量)
array_map('unlink', glob('*'));
// 方法 2: DirectoryIterator (記憶體效率佳,適合大量)
$dir = new DirectoryIterator('.');
foreach ($dir as $file) {
if ($file->isFile()) @unlink($file->getPathname());
}