在PHP開發中,經常需要刪除文件夾。PHP官方提供的rmdir()函數只能刪除空目錄,而delete_directory()是PHP刪除非空目錄的最佳方式。delete_directory()函數需要用到遞歸函數和unlink()函數。
function delete_directory($dir) {
if (!file_exists($dir)) {
return true;
}
if (!is_dir($dir)) {
return unlink($dir);
}
foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') {
continue;
}
if (!delete_directory($dir . DIRECTORY_SEPARATOR . $item)) {
return false;
}
}
return rmdir($dir);
}
函數的第一段if語句是在判斷目錄是否存在,如果不存在則直接返回true,不執行后面的代碼。而第二段if語句是在判斷刪除的是否為文件,如果是文件則返回unlink($dir),即刪除操作。第一層foreach語句則用于循環處理文件夾內的文件,通過遞歸的方式刪除文件夾內部的所有文件,再返回rmdir($dir)刪除掉已成為空的目錄。
為了避免刪除掉系統文件,需要加上條件判斷,只刪除指定文件夾內的文件,而不是刪除指定的盤符中的文件。
if (is_dir($delete_folder) && substr($delete_folder, -1) == '/') {
delete_directory($delete_folder);
}
我們使用is_dir()函數判斷刪除的文件夾是否為文件夾,同時使用substr()截取字符串最后一個字符檢查是否為\/符號來避免層級的誤判,保證不刪除系統文件或者不允許刪除的文件。
需要注意的是,雖然刪除文件操作是比較危險和敏感的操作,但是在PHP開發過程中總會用到刪除目錄或者刪除文件的操作,減少奇怪的刪除或者誤刪除的情況,增加驗證或者權限保護方案,可以更安全的使用PHP deldir操作。:
if (isset($_POST['submit'])) {
$delete_folder = $_POST['delete_folder'];
if (is_dir($delete_folder) && substr($delete_folder, -1) == '/') {
if ($delete_folder == '/photos/funny') {
echo 'This directory is not allowed to delete!';
} elseif (!delete_directory($delete_folder)) {
echo 'Directory Not Deleted, maybe some permission errors';
} else {
echo 'Directory Deleted Successfully';
}
} else {
echo 'Folder path not valid';
}
}
在代碼中,我們使用了
總之通過PHP deldir函數是一個非常方便和高效的刪除目錄或文件的方式,同時也需要注意保護相應的權限和文件夾規則,做好相關的判斷和處理,以免出現悲劇的情況。
上一篇php deldot函數
下一篇php define函數