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

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

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

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

函数代码如下:

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

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

  1. <?php
  2. $dir='Public';//传入一个文件夹路径
  3. deldir($dir);//调用函数
  4. ?>

说明:首先判断Public是否存在,如果在则打开Public,然后使用readdir循环读取Public目录里的内容,如果存在"."和".."这两个特殊目录则排除掉,如果遇到文件夹则调用自身处理,直到条件不满足,遇到文件则直接删除掉,最后层层跳出删除Public.

实例二,删除非空目录,代码如下:

  1. /*
  2. 自定义的删除函数,可以删除文件和递归删除文件夹
  3. */
  4. function my_del($path)
  5. {
  6. if(is_dir($path))
  7. {
  8. $file_list= scandir($path);
  9. foreach ($file_list as $file)
  10. {
  11. if( $file!='.' && $file!='..')
  12. {
  13. my_del($path.'/'.$file);
  14. }
  15. }
  16. @rmdir($path); //这种方法不用判断文件夹是否为空, 因为不管开始时文件夹是否为空,到达这里的时候,都是空的
  17. }
  18. else
  19. {
  20. @unlink($path); //这两个地方最好还是要用@屏蔽一下warning错误,看着闹心
  21. }
  22. }
  23. $path='d:/技术文档 - 副本'; //要删除的文件夹
  24. //如果php文件不是ANSI,而是UTF-8模式,而且要删除的文件夹中包含汉字字符的话,调用函数前需要转码
  25. //$path=iconv( 'utf-8', 'gb2312',$path );
  26. my_del($path);

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

  1. <?php
  2. functiondeletedir($dir){
  3. if(!handle=@opendir($dir)){//检测要打开目录是否存在
  4. die("没有该目录");
  5. }
  6. while(false!==($file=readdir($handle))){
  7. if($file!=="."&&$file!==".."){//排除当前目录与父级目录
  8. $file=$dir.DIRECTORY_SEPARATOR.$file;
  9. if(is_dir($file)){
  10. deletedir($file);
  11. }else{
  12. if(@unlink($file)){
  13. echo"文件<b>$file</b>删除成功。<br>";
  14. }else{
  15. echo"文件<b>$file</b>删除失败!<br>";
  16. }
  17. }
  18. }
  19. if(@rmdir($dir)){
  20. echo"目录<b>$dir</b>删除成功了。<br>n";
  21. }else{
  22. echo"目录<b>$dir</b>删除失败!<br>n";
  23. }
  24. }
  25. //测试程序
  26. $dir="/var/www/test";
  27. deletedir($dir);
  28. ?>

在/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