首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 递归删除目录树:opendir + unlink + rmdir 完全实现

     編輯:PHP 綜合知識

核心函数

<?php
/**
 * 递归删除目录及其所有内容
 * @param string $path 目录路径
 */
function delDirRecursive(string $path): void {
    if (!is_dir($path)) return;
    $dh = opendir($path);
    while (($file = readdir($dh)) !== false) {
        if ($file === '.' || $file === '..') continue;
        $full = $path . '/' . $file;
        if (is_dir($full)) {
            delDirRecursive($full); // 递归删除子目录
        } else {
            unlink($full);          // 删除文件
        }
    }
    closedir($dh);
    rmdir($path);                   // 删除空目录自身
}

// 用法
delDirRecursive('./cache');
?>

关键点

  • readdir() 返回 false 表示结束,需 !== false 判断
  • 跳过 . .. 避免无限递归
  • 先删文件/子目录,最后 rmdir() 删除空目录
  • 符号链接会被当作文件 unlink,目标不受影响

现代替代:RecursiveDirectoryIterator (SPL)

<?php
function delDirSPL(string $path): void {
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    foreach ($files as $file) {
        $file->isDir() ? rmdir($file->getPathname()) : unlink($file->getPathname());
    }
    rmdir($path);
}
?>

CHILD_FIRST 保证先处理子项,再处理父目录。

权限与错误处理

  • 生产环境加 @ 抑制警告或 try-catch(PHP 7+ Error)
  • 检查 is_writable() 避免权限不足报错
  • 大目录删除耗时,考虑异步/队列处理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved