PHP递归创建和删除文件夹的代码示例

顾言
顾言
发布时间:2026-10-16 | 3人浏览过
原创

本文提供了几种在PHP环境中使用递归方式批量创建和删除多级目录(包括其中所有子文件和文件夹)的代码片段。

目标:递归管理与删除目录

在处理如视频存储、日志归档等结构复杂的文件系统时,经常需要一次性创建多层级的空目录,或者清空并移除整个目录树。本文将展示几种不同的实现思路。

准备条件

  1. 环境要求:运行 PHP 脚本的服务器或本地环境需对目标路径有读写权限。
  2. 路径规范:建议使用 / 作为路径分隔符(兼容 Windows 和 Linux);测试时需确保传入的路径不存在严重的安全漏洞(如路径遍历)。

真实操作顺序

第1步:选择并应用【循环+递归】创建方案

目的:通过遍历字符串分割后的数组来实现逐级创建目录。该方法包含先判断层级再创建的逻辑,且附带了一个完整的递归删除示例。

入口:将代码保存为 PHP 文件并引入项目或本地运行。

动作:

  • 建立目录:解析输入的路径字符串(例如 'video/2/3/4'),将其拆分为数组。
  • 逐层构建:遍历数组,拼接当前路径。若该路径尚不存在(!is_dir),则调用 @mkdir($tmpPath, 0777) 新建。
  • 递归删除:对于非空目录,读取其下所有文件与子目录。如果是文件直接 unlink 删除,如果是子目录则递归调用自身,直到子目录变空后使用 rmdir 清理。

参数与状态:执行成功后返回最终生成的完整路径,失败则返回 false。确保目标编码正确(如旧版 GB2312)以避免中文乱码导致的失败。

<?php
class UtilsMakeDir{
    public static function makeDir($pathString){
        $pathArray = explode('/',$pathString);
        // 省略部分内部逻辑...
        $tmpPath = array_shift($pathArray);
        foreach ($pathArray as $val){
            $tmpPath .= "/".$val;
            if(is_dir($tmpPath)){
                continue;
            }
            else {
                @mkdir($tmpPath,0777);
            }
        }
        return is_dir($tmpPath) ? $tmpPath : false;
    }

    public static function delDir($stringPath){
        if(!$handle = @opendir($stringPath)){
            return false;
        }
        while (false !==($file = readdir($handle))){
            if($file !='.' && $file != '..'){
                $tmpdir = $stringPath."/".$file;
                if(is_dir($tmpdir)){
                    self::delDir($tmpdir);
                    rmdir($tmpdir);
                }
                if(is_file($tmpdir)){
                    unlink($tmpdir);
                }
            }
        }
        closedir($handle);
        return true;
    }
}
?>

第2步:使用【深度优先】的独立函数删除法

目的:提供一个更轻量级、不依赖类的函数库方案,专门用于安全地清空并销毁指定目录下的所有内容。

入口:deltree() 与辅助判断函数 is_empty_dir()。

动作:

  • 判断状态:首先调用 is_empty_dir 检查当前目录是否仅包含 . 和 .. 两个特殊标识。
  • 分支处理:
  • 若为空,直接使用 rmdir($pathdir) 删除当前目录。
  • 若不为空,打开句柄遍历其中的内容。针对子目录进行递归 deltree() 调用,针对普通文件使用 unlink() 剔除。

完成状态:当递归回溯到最顶层时,再次尝试使用 rmdir 删除该空目录本身。此方法在特定的Windows XP环境下经过验证,注意避免中文路径编码问题。

<?php
function is_empty_dir($pathdir){
    $d=opendir($pathdir);
    $i=0;
    while($a=readdir($d)){$i++;}
    closedir($d);
    if($i>2){return false;}else return true;
}

function deltree($pathdir){
    if(is_empty_dir($pathdir)){
        rmdir($pathdir);
    }else{
        $d=dir($pathdir);
        while($a=$d->read()){
            if(is_file($pathdir.'/'.$a) && $a!='.' && $a!='..'){
                unlink($pathdir.'/'.$a);
            }elseif(is_dir($pathdir.'/'.$a) && $a!='.' && $a!='..'){
                if(!is_empty_dir($pathdir.'/'.$a)){
                    deltree($pathdir.'/'.$a);
                }else{
                    rmdir($pathdir.'/'.$a);
                }
            }
        }
        $d->close();
        rmdir($pathdir);
    }
}
?>

第3步:执行【带状态反馈】的深层删除流程

目的:实现一个能明确反馈执行成功与否,且在删除失败时具备一定容错的删除逻辑。

动作:

  • 以 @rmdir($dir)==false && is_dir($dir) 作为触发条件进入清理程序,表明常规删除遇到阻碍(通常是因为目录非空)。
  • 使用 opendir 获取目录指针,并通过 readdir 循环取出每一项。
  • 识别项的类型:如果是目录,递归调用 deleteDir($file);如果是文件,直接 unlink($file)。
  • 清理完下层节点后,在外层再次尝试执行 rmdir 并返回布尔值结果。

风险提示:此过程会不可逆地物理删除硬盘上的数据,使用前务必确认路径无误。建议在开发环境中测试成功后再应用于生产任务。

<?php
header("Content-Type:text/html; charset=utf-8");
function deleteDir($dir) {
    if (@rmdir($dir)==false && is_dir($dir)) {
        if ($dp = opendir($dir)) {
            while (($file=readdir($dp)) != false) {
                if($file!='.' && $file!='..') {
                    $file=$dir.'/'.$file;
                    if (is_dir($file)) { 
                        deleteDir($file);
                    }else { 
                        unlink($file);
                    }
                }
            }
            closedir($dp);
        }else{
            return false;
        }
    }
    if (is_dir($dir) && @rmdir($dir)==false)
        return false;
    return true;
}

if(deleteDir('./test_delete'))
    echo "删除成功";
?>

完成判断与排错

  • 权限检查:若 mkdir 或 rmdir 均提示失败,请检查 Web 服务器进程用户(如 www-data 或 nginx)对父目录是否有写入或删除权限。
  • 字符编码:在较老的 PHP 版本或特定操作系统上,若路径中包含中文,可能因编码不匹配导致找不到文件而执行报错。统一使用 UTF-8 编码编写代码和定义路径是最稳妥的做法。
  • 递归死循环:在列出目录(如第三种方法的扩展阅读)时,务必屏蔽 . 和 ..,否则会导致程序无限递归直至耗尽栈内存。

简要总结

以上介绍了通过不同逻辑实现的 PHP 递归创建与删除文件夹的具体方法与代码细节。这些工具函数可以帮助开发者高效地应对复杂的文件目录管理需求,更多关于文件系统的操作方法请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表