php实现整个目录拷贝(使用for循环)

整个目录拷贝:可以有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>';

 

}

 

?>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值