php递归函数递归复制与删除目录的那些事

发布时间:2020-06-04编辑:脚本学堂
在php编程中,对多级目录的复制与删除是个问题,可以用php递归函数实现目录的复制与删除操作,自定义的递归函数复制目录与删除目录的一些例子。

php递归函数删除目录

在php中要复制一个包含多个子目录的目录,将涉及文件的复制、目录创建等操作。复制一个文件可以通过PHP提供的copy()函数完成,创建目录可以使用mkdir()函数。定义函数时,首先对源目录进行遍历,如果遇到的是普通文件,直接使用copy()函数进行复制。如果遍历时遇到一个目录,则必须建立该目录,然后再对该目录下的文件进行复制操作,如果还有子目录,则使用递归重复操作,最终将整个目录复制完成。

例子,自定义的递归函数复制目录。

复制代码 代码示例:
<?php
//自定义函数递归的复制带有多级子目录的目录
function copyDir($dirSrc,$dirTo){
if(is_file($dirTo)){  //如果目标不是一个目录则退出
echo "目标不是目录不能创建!!";
return; //退出函数
}
if(!file_exists($dirTo)){   //如果目标不是一个目录则退出
   mkdir($dirTo);  //创建目录
}
 
if($dir_handle = @opendir($directory)){ //打开目录,并判断是否能成功打开
while($filename = readdir($dir_handle)){  //循环遍历目录下的所有文件
if($filename != "."&& $filename != ".."){  //一定要排除两个特殊的目录
   $subFile = $directory."/".$filename;  //将目录下的子文件和当前目录相连
   $sunToFile = $dirTo."/".$filename;  //将目标目录的多级子目录相连
   if(is_dir($subSrcFile))  //如果为目录则条件成立
   copyDir($subSrcFile,$subToFile);  //递归调用自己复制子目录
   if(is_file($subSrcFile))  //如果是文件则条件成立
   copy($subSrcFile,$subToFile);  //直接复制到目标位置
}
}
losedir($dir_handle);  //关闭文件资源
 }
}
 
//测试函数,将目录“phpmyadmin”复制到“D:/admin”
copyDir("phpMyAdmin","D:/admin");
?>
 

从安全和跨平台等方面考虑,尽量不要去调用操作系统的shell命令“cp-a”完成目录的复制。

二、php创建和删除目录函数介绍和递归删除目录函数

php创建和删除目录函数介绍和递归删除目录函数,理解下递归删除目录的自定义函数的实现方法。

mkdir() — 新建目录

– 语法:bool mkdir (string pathname [,int mode])
– 尝试新建一个由 pathname 指定的目录。

rmdir() — 删除目录

– 语法:bool rmdir ( string dirname )
– 尝试删除 dirname 所指定的目录。 该目录必须是空的,而且要有相应的权限。如果成功则返回 TRUE,失败则返回
FALSE。

unlink — 删除文件

– 语法:bool unlink ( string filename )
– 删除 filename。和 Unix C 的 unlink() 函数相似。如果成功则返回 TRUE,失败则返回 FALSE。
在PHP中,使用mkdir()函数只需要传入一个目录名即可很容易地建立一个新目录。但删除目录所使用的函数rmdir(),只能删除一个空目录并且目录必须存在。如果是非空的目录就需要先进入到目录中,使用unlink()函数将目录中的每个文件都删除掉,再回来将这个空目录删除。如果目录中还存在目录,而且子目录也非空,就要使用递归的方法了。

例子,自定义递归函数删除目录:

复制代码 代码示例:
<?php
//自定义函数递归的删除整个目录
function delDir($directory){
if(file_exists($directory)){  //如果不存在rmdir()函数会出错
if($dir_handle = @opendir($directory)){   //打开目录,并判断是否能成功打开
while($filename = readdir($dir_handle)){   //循环遍历目录下的所有文件
   if($filename != "."&& $filename != ".."){   //一定要排除两个特殊的目录
   $subFile = $directory."/".$filename;   //将目录下的子文件和当前目录相连
   if(is_dir($subFile))//如果为目录则条件成立
   delDir($subFile);   //递归地调用自身函数,删除子目录
   if(is_file($subFile))  //如果是文件则条件成立
   unlink($subFile);   //直接删除这个文件
   }
}
closedir($dir_handle); //关闭文件资源
rmdir($directory); //删除空目录
 }
  }
}
 
dirDir("phpMyAdmin"); //调用delDir()函数,将程序所在目录中的“phpMyAdmin”文件删除
?>
 

当然也可以通过调用操作系统命令“rm-rf”删除非空的目录,但也要从安全和跨平台方面考虑尽量不要去使用。

三、php自定义函数之递归删除文件及目录

自定义函数之递归删除文件及目录的php代码
例子:
 

复制代码 代码示例:
<?php
/*—————————————————— */
//– 递归删除文件及目录
//– 例: del_dir (‘../cache/');注意:返回的/是必须的
//– $type 强制删除目录, true 是 ,false 否
/*—————————————————— */
function del_dir ($dir,$type=true)
{
$n=0;
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
//.svn 忽略 svn 版本控制信息
if ( $file == '.' or $file =='..' or $file == '.svn')
{
continue;
}
if (is_file ($dir.$file))
{
unlink($dir.$file);
$n++;
}
if (is_dir ($dir.$file))
{
del_dir ($dir.$file.'/');
if ($type)
{
$n++;
rmdir($dir.$file.'/');
}
}
}
}
closedir($dh);
}
return $n;
}

四、php递归函数删除整个目录

php实现用于删除整个目录的递归函数,包括php递归算法与目录技巧。

例子,php实现用于删除整个目录的递归函数。

复制代码 代码示例:
<?php
function delete_directory($dir) {
   if ($dh = @opendir($dir)) {
 while (($file = readdir ($dh)) != false) {
   if (($file == ".") || ($file == "..")) continue;
if (is_dir($dir . '/' . $file))
  delete_directory($dir . '/' . $file);
else
  unlink($dir . '/' . $file);
 }
 @closedir($dh);
 rmdir($dir);
   }
}
$dir = "./fakeDir";
delete_directory($dir);
?>