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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM