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 批量进行复制文件的更多相关文章

  1. 2016-9-6 批量给文件名的前面加上“igeek_高薪就业” 2、 利用FileInputStream和FileOutputStream复制文件

    在此只列出典型题目,有的题目扫一眼就有代码的不去浪费时间了,想要完整题目的评论留邮箱,看到就发.持续更新中... 1.批量给文件名的前面加上“igeek_高薪就业” package com.work; ...

  2. [shell实例]——用脚本实现向多台服务器批量复制文件(nmap、scp)

    练习环境: (1)所有服务器将防火墙和selinux关闭 (2)所有服务器的root密码设置为aixocm (3)所有服务器都为10.0.100.*网段,并保证能够和其它主机通信 (4)所有服务器确保 ...

  3. 批量bat脚本复制文件或文件夹

    主要用于在本地下,复制文件或文件夹到当前文件夹 @echo off echo 复制文件或文件夹到当前文件夹(复制文件选择[],复制文件夹选择[]) set /p num=输入选择的数字: : set ...

  4. poi批量导入excel文件

    package com.practice.util; import java.io.File; import java.io.FileInputStream; import java.io.FileN ...

  5. 批量修改java文件的包名

    需求:我复制进批量的java文件,但是包名需要用现在创建的包名 导入进来时,由于包名不一致会报错 解决办法,点击包名鼠标右键>Refactor>Rename 结果如下ok:

  6. C# 执行Cmd窗口中的命令 [复制文件实例]

    /// <summary> /// 复制文件夹 /// </summary> /// <param name="sCmd"></param ...

  7. [原创] 利用前端+php批量生成html文件,传入新文本,输出新的html文件

    本人因为要想自己写个小说网站练练手,在其中遇到的一些问题,将其解决方法总结出来,例如: 1:小说网站存储了大量的小说,每个小说主页都很相似,url不同,不是使用的history属性改写的,所以如果人工 ...

  8. 文件处理工具 gif合成工具 文件后缀批量添加工具 文件夹搜索工具 重复文件查找工具 网页图片解析下载工具等

    以下都是一些简单的免费分享的工具,技术支持群:592132877,提供定制化服务开发. Gif动图合成工具 主要功能是扫描指定的文件夹里的所有zip文件,然后提取Zip文件中的图片,并合成一张gif图 ...

  9. 个人永久性免费-Excel催化剂功能第103波-批量打开多文件或多链接

    有时简单的东西,却带来许多的便利,为了让大家可以记住并容易找寻到此功能,也将这么简单的功能归为一波,反正已经100+波了,也无需为了凑功能文章而故意罗列一些小功能带忽悠性地让人觉得很强大. 使用场景 ...

随机推荐

  1. 原生js实现图片网格式渐显、渐隐效果

    写正文前先吐槽一下:端午放假完第一天去某千人以上公司面试前端工程师,第一轮是我应聘职位的部门小领导,谈的不错,面试主要围绕要用到的技术来:第二轮来了我要说的正主,我了个去,问的问题一个和前端无关,问我 ...

  2. Thrift中required和optional

    最近在搞Thrift,对其字段声明中的required关键字有所误解,仔细调试了一下才明白其真实含义. required的意思不是说声明对象时,必须填这个值,而是Thrift在传输(序列化)过程中无论 ...

  3. js删除 object中的空值

    var data = { a: 'a', b: '' } 删除 b和''的配对, /** * Delete all null (or undefined) properties from an obj ...

  4. ThinkPHP 整合 PHPExcel ,数据导出功能实现,解决Invalid cell coordinate

    PHPExcel想必大家都不陌生,是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格 本次只做数据导出功能的 ...

  5. v9手机版文章内容不显示

    方法一: 打开PHPCMS v9的/phpcms/templates/default/wap/show.html页面, 将网页中的{$content}替换为:{$rs['content']} 这样wa ...

  6. Matlab: 路径的操作

    添加相对路径 在matlab中当代码很多时常常将结果存在不同的文件夹下面,常常使用相对路径对函数进行调用,但有时会存在问题.举个栗子: 代码结构如下: /codes/A/AA/code1.m /cod ...

  7. java 字符串替换函数replaceAll 一次同时替换多个字符串

    public static void main(String[] args) throws Exception { String src = "南京市玄武区北京东路徐州市鼓楼区戏马台&quo ...

  8. 如何用JavaScript复制到剪贴板

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. Kafka 源代码分析之ByteBufferMessageSet

    这里分析一下message的封装类ByteBufferMessageSet类 ByteBufferMessageSet类的源代码在源代码目录message目录下.这个类主要封装了message,mes ...

  10. 如何维持App拥护登录状态(仅仅理论)

    这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: 一:服务端默认的session 这种方式最大的优点是服务端不用增加任 ...