当前位置: 首页 > 后端技术 > PHP

PHP遍历目录下所有文件和文件夹复制功能

时间:2023-03-29 19:44:29 PHP

null,//对找到的文件进行操作'filterExt'=>[],//要过滤的文件后缀],$options);$scanQueue=[$path];while(count($scanQueue)!=0){$rootPath=array_pop($scanQueue);}//过滤['.','..']目录$paths=array_filter(scandir($rootPath),function($path){return!in_array($path,['.','..']);});foreach($pathsas$path){//连接完整路径$fullPath=$rootPath.DIRECTORY_SEPARATOR。$路径;//如果是目录,则合并到扫描队列中继续扫描if(is_dir($fullPath)){array_unshift($scanQueue,$fullPath);继续;}//如果不为空,过滤if(!empty($options['filterExt'])){$pathInfo=pathinfo($fullPath);$ext=$pathInfo['扩展名']??无效的;如果(in_array($ext,$options['filterExt'])){继续;}}if($options['callback']instanceofClosure){//不处理回调处理后为空的数据$fullPath=$options['callback']($fullPath);//只要返回的数据不是字符串路径,就不会处理if(!is_string($fullPath)){continue;}}array_push(static::$files,$fullPath);}}返回静态::$文件;}/***目录复制,返回复制的文件个数,*@param$sourcestring源文件,填写绝对路径*@param$deststring目标路径,填写绝对路径*@param$forcebool每次开启都会强制覆盖原文件,false不会覆盖,不处理已有文件*@returnintNumber复制文件的数量*@author:Vencenty*/staticfunctioncopy($source,$dest,$force=true){static$counter=0;$paths=array_filter(scandir($source),function($file){return!in_array($file,['.','..']);});foreach($pathsas$path){//要复制的源文件的完整路径$sourceFullPath=$source.DIRECTORY_SEPARATOR。$路径;//要复制到的文件$destFullPath=$dest.DIRECTORY_SEPARATOR。$路径;//如果复制的目的地址不是文件夹,则文件夹不存在,所以先创建文件夹;chmod($destFullPath,0755);}//递归复制static::copy($sourceFullPath,$destFullPath,$force);继续;}//如果不开启强制覆盖,如果文件已经存在,直接跳过不处理if(!$force&&file_exists($destFullPath)){continue;}//每次复制成功,文件计数器+1if(copy($sourceFullPath,$destFullPath)){$counter++;}}返回$counter;}}$path=realpath('../');$r=Dir::scan($path,['callback'=>function($file){returnfilemtime($file)>strtotime('-1day')?$file:null;//查找修改的文件},'filterExt'=>[]]);//print_r($r);$r=Dir::copy('C:\phpStudy\PHPTutorial\WWW\php\.idea','C:\phpStudy\PHPTutorial\WWW\php',true);print_r($r);项目中需要用到这两个函数,所以写了这两个方法,其中scan方法的第二个参数options可以根据自己的需要扩展,$r=Dir::scan($path,['callback'=>function($file){returnfilemtime($file)>strtotime('-1day')?$file:null;//查找一天内修改过的文件},'filterExt'=>['php']//过滤所有PHP文件]);callback回调函数可用于实现文件过滤功能,文件类型搜索等,options参数相当于扩展功能配置项,具体场景分析新增配置items会覆盖默认配置,相比于afunctionstaticfunctionscan($path,$callback,$filterExt){}我更喜欢下面的写法,更灵活staticfunctionscan($path,$options){$options=array_merge(['callback'=>null,'filterExt'=>[],'otherOptions'=>null],$options);}Dir::copy($source,$dest,$force=true)这个函数也很简单,就是有一个强制覆盖和非强制覆盖的选项,自己实现了,简单记录一下