首页 > php文件操作 > PHP递归删除文件与目录函数

PHP递归删除文件与目录函数

在php中删除文件与目录rmdir()函数就可以搞定,但是要删除一个非空目录,将不能进行快速的删除,必须先将目录中文件删除,但是目录里可能还会有子目录所以要进行PHP递归删除目录.

递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行.

我们来看一个经典的递归删除函数,函数的作用:删除目录下面的所有文件,并删除目录.

函数代码如下:

<?php
function deldir($dirname) {
    if (file_exists($dirname)) { //首先判断目录是否有效
        $dir = opendir($dirname); //用opendir打开目录
        while ($filename = readdir($dir)) { //使用readdir循环读取目录里的内容
            if ($filename != "." && $filename != "..") { //排除"."和".."这两个特殊的目录
                $file = $dirname . "/" . $filename;
                if (is_dir($file)) { //判断是否是目录,如果是则调用自身
                    deldir($file); //使用递归删除子目录
                    
                } else {
                    @unlink($file); //删除文件
                    
                }
            }
        }
        closedir($dir); //关闭文件操作句柄
        rmdir($dirname); //删除目录
        
    }
}
?>

使用实例:Public是一个文件夹,里面有许多文件夹和文件,调用deldir($dirname)把它删除.

<?php
$dir = 'Public'; //传入一个文件夹路径
deldir($dir); //调用函数
//说明:首先判断Public是否存在,如果在则打开Public,然后使用readdir循环读取Public目录里的内容,如果存在"."和".."这两个特殊目录则排除掉,如果遇到文件夹则调用自身处理,直到条件不满足,遇到文件则直接删除掉,最后层层跳出删除Public.
//实例二,删除非空目录,代码如下:
/*
 自定义的删除函数,可以删除文件和递归删除文件夹 
*/
function my_del($path) {
    if (is_dir($path)) {
        $file_list = scandir($path);
        foreach ($file_list as $file) {
            if ($file != '.' && $file != '..') {
                my_del($path . '/' . $file);
            }
        }
        @rmdir($path); //这种方法不用判断文件夹是否为空, 因为不管开始时文件夹是否为空,到达这里的时候,都是空的
        
    } else {
        @unlink($path); //这两个地方最好还是要用@屏蔽一下warning错误,看着闹心
        
    }
}
$path = 'd:/技术文档 - 副本'; //要删除的文件夹
//如果php文件不是ANSI,而是UTF-8模式,而且要删除的文件夹中包含汉字字符的话,调用函数前需要转码
//$path=iconv( 'utf-8', 'gb2312',$path );
my_del($path);
?>

例3,可查看成功之失败原因,代码如下:

<?php
functiondeletedir($dir) {
    if (!handle = @opendir($dir)) { //检测要打开目录是否存在
        die("没有该目录");
    }
    while (false !== ($file = readdir($handle))) {
        if ($file !== "." && $file !== "..") { //排除当前目录与父级目录
            $file = $dir . DIRECTORY_SEPARATOR . $file;
            if (is_dir($file)) {
                deletedir($file);
            } else {
                if (@unlink($file)) {
                    echo "文件<b>$file</b>删除成功。<br>";
                } else {
                    echo "文件<b>$file</b>删除失败!<br>";
                }
            }
        }
        if (@rmdir($dir)) {
            echo "目录<b>$dir</b>删除成功了。<br>n";
        } else {
            echo "目录<b>$dir</b>删除失败!<br>n";
        }
    }
    //测试程序
    $dir = "/var/www/test";
    deletedir($dir);
?>

 

在/var/www/test文件夹下建一写文件夹和文件测试    

shell>touchaaa    
shell>touchbbb    
shell>touchccc    
shell>toucheee    
shell>touchffff    
shell>mkdir111    
shell>mkdir222    
shell>mkdir333

分别再在111,222,333文件夹下建写文件这里就不多说了,然后给他们权限    

shell>chown[url]www.www[/url]test-R


本文地址:http://www.phprm.com/wenjian/fs3663.html

转载随意,但请附上文章地址:-)

标签:php递归删除 目录函数

相关文章

发表留言