php 批量进行复制文件
1、前言
目标:php批量进行复制指定的目录文件夹下所有文件复制到另一个文件夹下
所使用的的php函数:is_dir,opendir,readdir,scandir,mkdir,closedir,等等(注:其他文件操作函数也可以完成,这里只列举了本次使用的函数)
2、相关函数介绍
2.1、is_dir
详情参考:https://www.w3cschool.cn/php/func-filesystem-is-dir.html
2.2、opendir
详情参考:https://www.w3cschool.cn/php/func-directory-opendir.html
2.3、readdir
详情参考:https://www.w3cschool.cn/php/func-directory-readdir.html
2.4、scandir
详情参考:https://www.w3cschool.cn/php/func-directory-scandir.html
2.5、mkdir
详情参考:https://www.w3cschool.cn/php/func-filesystem-mkdir.html
2.6、closedir
详情参考:https://www.w3cschool.cn/php/func-directory-closedir.html
3、本次测试的目录结构
targetDir下有两个空目录
copyDir 下有两个等待复制的目标文件
本次测试的目的:
将copyDir下的两个目录,完成的复制到targetDir下的两个空目录中
4、代码构成
<?php 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; } }
调用:
<?php require_once ‘fileObj.class.php‘; $fileObj = new fileObj(); $fileObj->allCopy(‘targetDir‘,‘copyDir‘);
查看运行结果:
从结果上看,已经达成了所需要的文件的复制
5、结语
文件批量复制的步骤基本为:
1、扫描目标目录获取所有需要复制的子目录(空目录)
2、扫描源目录进行复制(判断是否文件还是目录)
3、如果是文件则直接进行复制,如果是目录则递归调用2过程进行重新扫描(记得创建相同的目录)
4、复制量大,环境原因,总有失败的时候,记得需要记录
时间: 2024-11-03 21:13:09