刚写了一个目录拷贝的代码,老师如果有时间的话,希望老师帮忙看一下,谢谢。

来源:2-10 文件及目录处理相关考点

silas666

2017-09-16

// 题目:目录及目录里的文件复制到新目录,
// 1.循环获取目录里的文件名,输出到数组
// 2.复制文件到新数组

// 1获取文件名,返回到一维数组(目录下的所有文件)格式:绝对目录+文件名
function getFilesName($dir){
	if(!is_dir($dir)){
		return '不是目录';
	}

	$res = [];
	if( false != (@$handle = opendir($dir)) ){
		while( false != ($file = readdir($handle)) ){

			// 过滤掉 . .. 和 以.开头的文件
			if($file != '.' && $file != '..' && 0 !== strpos($file, '.')){
				$file_name = $dir . '/' .$file;
				if(filetype($file_name) == 'file'){
					array_push($res, $file_name);
				} else if(filetype($file_name) == 'dir'){
					foreach (getFilesName($file_name) as $file) {
						array_push( $res, $file);
					}
					
				}
			}
			
		}
	}

	return $res;
}

// 循环创建目录
function loopCreateDir($path){
	$dir = dirname($path);  //从文件地址获得文件路径,文件名用basename
	if(!file_exists($dir)  ){ //file_exists — 检查文件或目录是否存在
		loopCreateDir($dir);

		mkdir($dir, 0777);
	    chmod($dir, 0777);
	}
}

// 将目录中的文件复制到新目录
// 1.检测文件目录是否存在
function copyToNewDir($source_dir,  $target_dir){
	$files =  getFilesName(__DIR__);
	$target_files = str_replace($source_dir, $target_dir, $files);  // 对数组批量替换

	for ($i=0; $i < count($files); $i++) { 

		loopCreateDir($target_files[$i]);

		// 复制文件,方法1
		copy($files[$i], $target_files[$i]);

		// 复制文件,方法2
		//file_put_contents( $target_files[$i],file_get_contents($files[$i]) );

	}
}


copyToNewDir(__DIR__, __DIR__.'/../b');

请问,复制文件那里,方法1和方法2有什么区别呢?哪一种更好一些呢?谢谢老师

写回答

1回答

Jason

2017-09-18

几个问题:

  1. 第一个函数的返回值,如果不是目录,返回false,这样比较容易判断使用

  2. 递归创建目录可以使用mkdir直接完成,不用这么麻烦,第三个参数给true即可

  3. 最后一个函数获取目录下的文件名称可以使用glob函数

1
3
Jason
回复
silas666
copy只会操作一次IO,效率更高
2017-09-18
共3条回复

360大牛带你横扫PHP职场 全面解读PHP面试

全面、系统剖析PHP面试,拿下心仪Offer

1817 学习 · 464 问题

查看课程