我真的哭了啊!
折騰半天,結果glob這個函數有點坑,無法獲取到.開頭的系統隱藏文件,於是折騰半天,原來發現還有其他函數可以查詢所有文件!
PHP 刪除指定目錄下面的所有文件以及目錄,函數兩個參數,一個是刪除的目錄,一個是不需要刪除的文件數組
function deleteDirectory($directory, $excludes = []) {
// 判斷目錄是否存在
if (!is_dir($directory)) {
throw new Exception("目錄 $directory 不存在");
}
// 獲取目錄中的所有文件和目錄
$files = array_diff(scandir($directory), ['.', '..']);
// 遍歷所有文件和目錄
foreach ($files as $file) {
$path = $directory . DIRECTORY_SEPARATOR . $file;
// 如果是目錄,遞歸處理子目錄
if (is_dir($path)) {
deleteDirectory($path, $excludes);
rmdir($path);
}
// 如果是文件,並且不在不需要刪除的文件列表中,就刪除文件
elseif (is_file($path) && !in_array($file, $excludes)) {
unlink($path);
}
}
}該函數有兩個參數:$directory 表示要刪除的目錄,$excludes 表示不需要刪除的文件列表,是一個數組。如果要刪除的目錄不存在,函數會拋出異常。
函數首先使用 scandir 函數獲取目錄中的所有文件和目錄,並使用 array_diff 函數去掉 . 和 ..,得到一個僅包含文件和目錄名的數組。然後遍歷所有文件和目錄,如果是目錄,就遞歸調用自身,處理子目錄,並使用 rmdir 函數刪除空目錄;如果是文件,並且不在不需要刪除的文件列表中,就使用 unlink 函數刪除文件。
調用方法
// 刪除 /path/to/directory 目錄下的所有文件和目錄,但不刪除 1.php 和 2.php
$directory = '/path/to/directory';
$excludes = ['1.php', '2.php'];
deleteDirectory($directory, $excludes);