php 复制一个文件,php 批量进行复制文件

本文介绍了如何使用PHP实现批量复制指定目录下的所有文件及子目录到另一个目录。主要涉及is_dir、opendir、readdir、scandir、mkdir和closedir等函数,通过递归调用来完成目录的复制。代码中包含了预处理、文件复制和错误日志记录等功能,确保了目录结构的完整复制。测试结果显示,文件和目录成功地被复制到了目标位置。
摘要由CSDN通过智能技术生成

1、前言

目标:php批量进行复制指定的目录文件夹下所有文件复制到另一个文件夹下

所使用的的php函数:is_dir,opendir,readdir,scandir,mkdir,closedir,等等(注:其他文件操作函数也可以完成,这里只列举了本次使用的函数)

2、相关函数介绍

2.1、is_dir

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMDIyMThfODY0NjcucG5n.jpg

2.2、opendir

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMDIzMjZfMjc5NTkucG5n.jpg

2.3、readdir

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMDI0MzBfMTY5ODQucG5n.jpg

2.4、scandir

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMDI1MzRfMzQ1NjUucG5n.jpg

2.5、mkdir

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMDI3MDdfODczOTUucG5n.jpg

2.6、closedir

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMDI5MzBfMTg1MzMucG5n.jpg

3、本次测试的目录结构

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMTEzMzdfODEwMTAucG5n.jpg

targetDir下有两个空目录

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMTE0MTJfMjUzMzQucG5n.jpg

copyDir 下有两个等待复制的目标文件

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMTE0NDhfNzA1ODkucG5n.jpg

本次测试的目的:

将copyDir下的两个目录,完成的复制到targetDir下的两个空目录中

4、代码构成

class fileObj{

/**

* [allCopy description] 将源目录的文件复制到目标目录的所有子文件夹上

* @param [type] $rootDir [description] 目标目录

* @param [type] $resouceDir [description] 源目录

* @return [type] [description]

*/

public function allCopy($rootDir, $resouceDir) {

//如果有一个不是目录,则结束

if(is_dir($rootDir) && is_dir($resouceDir)){

$this->preDir($rootDir, $resouceDir);

}else{

echo '所选择目录不是有效目录';

}

}

/**

* [preDir description] 复制前对目标目录的预处理

* @param [type] $rootDir [description] 目标目录

* @param [type] $resouceDir [description] 源目录

* @return [type] [description]

*/

private function preDir($rootDir, $resouceDir) {

$dh = opendir($rootDir);//打开目标目录

while($handle = readdir($dh)) {

//每个目录都含有上级目录和本级目录的标志

if($handle == '.' || $handle == '..') {

continue;

}

$targetDir = $rootDir.'/'.$handle;//需要加上根目录

echo $targetDir;

if(is_dir($targetDir) && !$this->sizeofDir($targetDir)) {

continue;//这里不处理非空目录,自动过滤非目录

}

echo 1;

$this->startCopy($targetDir, $resouceDir);

}

closedir($dh);

}

/**

* [startCopy description] 进行文件的复制操作

* @param [type] $targetDir [description] 目标目录

* @param [type] $resouceDir [description] 源目录子目录

* @return [type] [description]

*/

private function startCopy($targetDir, $resouceDir) {

$dh = opendir($resouceDir);//扫描源目录

while($handle = readdir($dh)) {

// .和..不进行处理

if($handle == '.' || $handle == '..') {

continue;

}

$newResource = $resouceDir.'/'.$handle;

//如果是目录,则需要创建相同目录,进行复制

if(is_dir($newResource)) {

$newTargetDir = $this->createDir($targetDir, $handle);

$this->startCopy($newTargetDir,$newResource);//遇到目录需要进行递归调用

}else {

$re = copy($newResource, $targetDir.'/'.$handle);

if(!$re){

//将复制失败文件写到日志中

file_put_contents('error.log',$targetDir.'/'.$handle."复制失败\r\n",FILE_APPEND);

}

}

}

}

/**

* [createDir description] 创建和源目录相同的文件目录

* @param [type] $dirName [description] 新目录根目录

* @param [type] $copyDir [description] 源目录子目录

* @return [type] [description]

*/

private function createDir($dirName, $copyDir) {

$newDir = $dirName.'/'.$copyDir;

//判断目录是否存在

if(!is_dir($newDir)){

mkdir($newDir);

}

return $newDir;

}

/**

* [sizeofDir description] 判断目录是否值含有.和..

* @param [type] $dirName [description] 目录名称

* @return [type] [description]

*/

private function sizeofDir($dirName) {

$dh = scandir($dirName);

if(sizeof($dh) <= 2){

return true;//空目录

}

return false;

}

}

调用:

require_once 'fileObj.class.php';

$fileObj = new fileObj();

$fileObj->allCopy('targetDir','copyDir');

查看运行结果:

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMTE4MTRfNDAyODkucG5n.jpg

L3Byb3h5L2h0dHAvd3d3LmNoZW55eC5jb20uY24vemJfdXNlcnMvdXBsb2FkLzIwMTcvMDcvMjAxNzA3MjAyMTE4MjVfOTkzNTQucG5n.jpg

从结果上看,已经达成了所需要的文件的复制

5、结语

文件批量复制的步骤基本为:

1、扫描目标目录获取所有需要复制的子目录(空目录)

2、扫描源目录进行复制(判断是否文件还是目录)

3、如果是文件则直接进行复制,如果是目录则递归调用2过程进行重新扫描(记得创建相同的目录)

4、复制量大,环境原因,总有失败的时候,记得需要记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值