整个目录拷贝:可以有2中方式实现:
1.用递归,读目录,遇到子目录递归处理;
2.用for循环,读最初的主目录,其中独到子目录时,放入目录数组,然后通过数组的增长控制循环,数组里装在要处理的目录的初始信息,路路径等,这样就实现了对每个目录的拷贝;
递归应该都可以转化为for的形式,就是当遇到要处理相同问题时(路拷贝目录)只要把这些问题的初始信息记录在数组里,区分开来,然后随着数组的长度变化以实现度每个问题的处理;常用的for循环都是本次循环的结尾初始化下一次的信息,而这个信息覆盖前面的,而当在一次循环中遇到多个相同问题的时候,就有些问题,但路过把初始化这些问题的信息放在数组中,就可以解决了,依次处理,以上是我的胡思乱想
递归要建立一个函数,以在内部调用,而for不用
递归拷贝目录的过程:读当前目录,遇到文件拷到目标位置,遇到子目录,得到其初始信息(路路径)立即递归,这样做到了和原目录文件的创建的顺序是相同的;
for循环拷贝目录的过程:读当前目录,遇到文件拷贝,遇到子目录,记录其初始信息(路径),放在预处理的目录数组中,这样文件创建顺序就有了变化,总是先建文件,子目录后建,总体问题不大;
递归总是很难以理解的,这个递归过程也不好描述,for就好些了
我写了2个PHP文件;1.copy_digui.php递归拷贝目录的,2.copy_mulu.php for循环拷贝的;在输入框输入 拷贝目录 目标目录的路径(注意:目标目录不能是拷贝目录的子目录,这样会死循环),就会在目标目录生成和拷贝目录同名的文件夹,里面文件结构和其相同,for时顺序是不符的,因为是先考文件,后目录的
*在这里我没有贴递归的代码
php代码:需要命名为copy_mulu.php,要填写表单
<?php
set_time_limit(0);
//获取目录名函数定义开始
function mulu_name($path)
{
if(substr($path,strlen($path)-1,1)=='\\')$path=substr($path,0,strlen($path)-1);
//echo "path:".$path.'<br>';
$path=substr($path,2);
//var_dump($path);
//echo "path:".$path.'<br>';
if($path){//echo '非磁盘目录<BR>';
if(($wz=strrpos($path,'\\'))!==false){
$mulu=substr($path,$wz+1);
}
}
else{//echo '是磁盘目录<Br>';
$mulu='.';}
//echo $mulu;
return $mulu;
}
//获取目录名函数定义结束
//返回拷贝初始根目录
function root($path)
{if(substr($path,strlen($path)-1,1)=='\\')$path=substr($path,0,strlen($path)-1);
if(($wz=strrpos($path,'\\'))!==false)
$path=substr($path,0,$wz);
return $path;
}
//当提交时
if(isset($_GET['copy'])&&$_GET['copy']=='yes')
{$mulu1=$_GET['mulu1'];
$mulu2=$_GET['mulu2'];
if(!@opendir($mulu1))die('请检查拷贝目录是否正确');
if(!@opendir($mulu2))die('请检查目标目录是否正确');
if(($wz=strpos($mulu2,$mulu1))!==false)die('目标目录不能是拷贝目录的子目录,会形成死循环');
$name=mulu_name($mulu1);
$root1=root($mulu1);
$mulu_arr=array($name);
$root2=$mulu2;
if(substr($root2,strlen($root2)-1,1)=='\\')$root2=substr($root2,0,strlen($root2)-1);
//$root2=$root2.'\\'.$name;
//if(!file_exists($root2))mkdir($root2);
echo $name.'---'.$root1.'----'.$root2.'<br>';
$j=0;
//批量拷贝文件for循环实现
for($i=0;$i<count($mulu_arr);$i++)
{
//拷贝单个目录的过程,提供拷贝目录路径,目标路径,拷贝文件,同时取其中目录放到目录数组中,待下一次拷贝
$name=$mulu_arr[$i];
$dir1=$root1.'\\'.$name;
$dir2=$root2.'\\'.$name;
echo '开始拷贝目录:'.$dir1.' 目标目录:'.$dir2.'<br>';
if(!file_exists($dir2))mkdir($dir2);
$huihua=opendir($dir1);
while($file=readdir($huihua)){
$url1=$dir1.'\\'.$file;
$url2=$dir2.'\\'.$file;
//echo $url1.'---'.$url2.'<br>';
if(is_file($url1)){if(!file_exists($url2)){copy($url1,$url2);echo '文件:'.$url1.'拷贝到目录:'.$dir2.'成功<br>';}else echo $url2.'文件已存在<br>';}
else{if($file!='.'&&$file!='..'){echo $url1.'目录需要把其添加进目录数组,以后依次处理<br>';
$j++;
$mulu_arr[$j]=$name.'\\'.$file;
}
else echo '. or ..不需要处理<br>';
}
}
echo '拷贝目录:'.$dir1.'完毕';
echo '<br><br><br>';
}
}
//未提交输出提供初始信息的表单
else{echo '<form method="get" action="copy_mulu.php">
拷贝目录:<input type="text" name="mulu1">路:c:\1<br>目标目录:<input type="text" name="mulu2"><br><input type="submit" value="yes" name="copy">
</form>';
}
?>