【www.bbyears.com--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)把它删除
$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,可查看成功之失败原因
代码如下 <?phpfunctiondeletedir($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"文件$file删除成功。
";
}else{
echo"文件$file删除失败!
";
}
}
}
if(@rmdir($dir)){
echo"目录$dir删除成功了。
n";
}else{
echo"目录$dir删除失败!
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