zoukankan      html  css  js  c++  java
  • php 批量进行复制文件

    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."复制失败
    ",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、复制量大,环境原因,总有失败的时候,记得需要记录

  • 相关阅读:
    Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
    ps中的中英文对照
    2019.6.27 oracle复习 表空间
    pthon学习笔记 2020/4/6
    运维岗位发展方向
    sql server复习重点
    linux的shell script
    linux知识扫盲
    Android Studio 三、软件学习教程-知识点
    Android Studio 二、github项目下载 2019.8.23
  • 原文地址:https://www.cnblogs.com/ImCehnyx/p/7214598.html
Copyright © 2011-2022 走看看