php清空一个文件夹,并过滤指定文件和目录

清空一个目录,可以设置保留某个名称的文件和文件夹不被删除,简单实用

<?php

//删除目录及文件
function remove_directory($dir) {
  foreach(glob($dir) as $fn) { 
        echo " removing $fn<br>\n";
        if (!is_writable($fn))@chmod($fn, 0777);
        if(is_dir($fn)){@rmdir($fn);}else{@unlink($fn);}
   } 
}

//扫描目录
function recurdir($pathname,$guolv='')
{
    $result=array();$temp=array();
    //检查目录是否有效和可读
    if(!is_dir($pathname) || !is_readable($pathname))
    return null;
    //得到目录下的所有文件夹
    $allfiles=scandir($pathname);
    foreach($allfiles as $key => $filename)
    {
        //如果是“.”或者“..”的话则略过
        if(in_array($filename,array('.','..')))continue;
        if(count($guolv)>0){$lv=explode(",",$guolv);if(in_array($filename,$lv))continue;}

        //得到文件完整名字
        $fullname =$pathname . "/" .$filename;
        //如果该文件是目录的话,递归调用recurdir
        $temp[]=$fullname;
        if(is_dir($fullname)){
            $nowpath=explode("/",$fullname);
            if(count($guolv)>0){$lv=explode(",",$guolv);if(in_array($nowpath[count($nowpath)-1],$lv))continue;}
            $result[$filename] = recurdir($fullname,$guolv);}
    }   
    //最后把临时数组中的内容添加到结果数组,确保目录在前,文件在后
    foreach($temp as $f){
        $result[]=$f;
    }
    return $result;
}

//获取所有文件
function array_values_recursive($ary)
{
   $lst = array();
   foreach( array_keys($ary) as $k ){
     $v = $ary[$k];
     if (is_array($v)) {$lst = array_merge( $lst, array_values_recursive($v));}else{$lst[] = $v;}
   }
   return $lst;
}

//清空demo目录,但保留该目录下名为w.txt的目录和文件
$DelDir = '/www/huqiao.net/demo';
$file   = array_values_recursive(recurdir($DelDir,'w.txt'));
foreach($file as $k => $v){
   remove_directory($v);
}
?>