1. 程式人生 > >php 批量進行復制文件

php 批量進行復制文件

w3cschool pre clas 測試 名稱 文件操作 class ret 測試的

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、復制量大,環境原因,總有失敗的時候,記得需要記錄

php 批量進行復制文件