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、复制量大,环境原因,总有失败的时候,记得需要记录

时间: 2024-11-03 21:13:09

php 批量进行复制文件的相关文章

批量复制文件无密码输入

无密码输入批量复制文件 作用:批量复制:复制单个文件或者压缩包到多台服务器,无密码输入<我用着挺方便的> 名称:scp_file.py 环境:需要有Python,需要paramiko <在管理机上安装,一劳永逸> 执行方式: ./scp_file.py iplist src_file dst_file 说明: iplist:ip列表 src_file:绝对路径下的文件 例如:/tmp/test.txt dst_file:绝对路径下的文件 例如:/data/log1.txt 备注:复

批量复制文件

1 #!/bin/bash 2 #批量复制文件到指定的目录 3 #需求:有很多文件需要在一个文件目录查找到相对应的文件,然后把它复制到新建目录 4 #方法1:find /media -name 'a'* |xargs -I [] cp [] /mnt 5 #方法2:进入存放文件目录执行 ls|grep a |xargs -I [] cp [] /mnt 6 #方法3:首先新建一个txt文件,把表名写进去,然后执行下面脚本 7 for file in `cat a.txt`;do 8 a=`ls|

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

在此只列出典型题目,有的题目扫一眼就有思路的不去浪费时间了,想要完整题目的评论留邮箱,看到就发. 1.批量给文件名的前面加上“igeek_高薪就业” package com.work; import java.io.File; public class Work0906 { public static void main(String[] args) { //1.批量给文件名的前面加上“igeek_高薪就业” String path = "D:/wkexp/extjs"; String

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

练习环境: (1)所有服务器将防火墙和selinux关闭 (2)所有服务器的root密码设置为aixocm (3)所有服务器都为10.0.100.*网段,并保证能够和其它主机通信 (4)所有服务器确保sshd服务已经启动(开放默认的22端口) 脚本要求实现: 将本机/etc目录下以conf为扩展名的文件打包压缩为tar.bz2,然后将此文件复制一份到10.0.100.1-->10.0.100.254地址段上所有开启的主机,具体路径为/tmp/sjjy/文件.在使用scp复制时无需手动输入密码.

不同方式复制文件效率的比较

文件拷贝 测试复制文件的大小:4.5MB 1 /* 2 3 * BufferedInputStram&BufferedOutputStream 4 5 * 这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入 6 7 * 或读取操作时,都会加上缓冲,这种流模式提高了IO的性能 8 9 * 10 11 * 从应用程序中把输入放入文件,相当于将一缸水倒入到另一个 12 13 * 缸中: 14 15 * FileOutPutStream----->write()方法相当于一滴一滴的 16 1

linux两台服务器间复制文件scp

换服务器或添加服务器时常会用到两台服务器之间复制文件,这个时候就可以使用scp命令. scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度. 两台主机之间复制文件必需得同时有两台主机的复制执行帐号和操作权限. scp一般有六种使用方法: 本地复制远程文件:(把远程的文件复制到本地) scp [email protected]:/val/test/test.tar

批量修改java文件的包名

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

poi批量导入excel文件

package com.practice.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import ja

【批处理】TXT文件批量转HTML文件工具

说到批量转html文件,相信喜欢看小说或经常制作电子书和教程的朋友应该很熟悉.因为,我们每次都会面临成千上万的txt文件,要将其转换为能正确显示的html文件是很麻烦的.当然,现在有很多的软件也可以实现,但本人也下了很多的软件,试了很多次,结果也令人不甚满意.因此,我就自己动手制作了一个批处理来解决这个问题,现在给大家分享一下. 我们这个批处工具在转换为HTML格式后仍以原文件名进行保存,且默认第一行为标题行和网页名称!因此请确保所有TXT文件第一行都有标题,否则第一段就会成为标题. 为保证转换