標籤:環境 app erro 結束 lang 過程 htm desc this
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、代碼構成
<?phpclass 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;}}
調用:
<?phprequire_once ‘fileObj.class.php‘;$fileObj = new fileObj();$fileObj->allCopy(‘targetDir‘,‘copyDir‘);
查看運行結果:
從結果上看,已經達成了所需要的檔案的複製
5、結語
檔案批量複製的步驟基本為:
1、掃描目標目錄擷取所有需要複製的子目錄(空目錄)
2、掃描來源目錄進行複製(判斷是否檔案還是目錄)
3、如果是檔案則直接進行複製,如果是目錄則遞迴調用2過程進行重新掃描(記得建立相同的目錄)
4、複製量大,環境原因,總有失敗的時候,記得需要記錄
php 批量進行複製檔案