写一个复制文件夹的脚本的时候出现的问题

          本来以为这么一个简单的复制文件夹的脚本十来分钟就搞定了,结果搞了一下午才搞定。

          其实思路非常简单,就是设定$fromDir和$toDir,将$fromDir目录的文件全部复制到$toDir,其实搞这个脚本的目的就是把我电脑上面的文件自动复制到我的移动硬盘上面来,起一个备份的作用,一个个手动的拷贝太麻烦,个人比较懒,所以就准备搞一个脚本来做。

          由于文件夹中可能有子文件夹,所以采用广度优先,即扫描文件的时候发现这个文件是一个文件夹,就把它放入到队列的末尾,然后继续扫描,等把这个文件夹的文件扫描完成,就继续从队列中取出一个元素,一直到队列为空。

          队列这一块都没出什么问题,而问题主要出在了中文目录上面,网上查了一下,windows文件名的编码要变成GBK,而有可能文件名编码是UTF-8,这样就导致文件名乱码。

           最开始使用iconv进行转码,但是发现使用这个转码之后又一定的问题,如iframe代码.txt这个字符串转码后变成了iframe,完全错了。。。

           后面查到还可以使用mb_convert_encoding来转码,所以修改了一下:


function changeEncoding($str) {
	if(mb_check_encoding($str,'UTF-8')) {
		//只有UTF-8编码的时候才进行转码
		return mb_convert_encoding($str,"GBK","UTF-8");
	}
	return $str;
	//return iconv('UTF-8','GBK',$str);
}
           后面乱码解决了,虽然是如此简单的问题,但是搞了我一下午啊。。。


          整个代码如下:


<?php
error_reporting(-1);
$fromDir = 'G:\测试\b';
$toDir = 'G:\测试\a';
$fromDir = changeEncoding($fromDir);
$toDir = changeEncoding($toDir);
//由于可能出现中文乱码,所以必须全部通过changeEncoding函数处理
if(!is_dir($fromDir)) {
	echo 'fromDir is not a valid dir';
	exit();
}
if(!is_dir($toDir)) {
	echo 'toDir is not a valid dir';
	exit();
}
function changeEncoding($str) {
	if(mb_check_encoding($str,'UTF-8')) {
		//只有UTF-8编码的时候才进行转码
		return mb_convert_encoding($str,"GBK","UTF-8");
	}
	return $str;
	//return iconv('UTF-8','GBK',$str);
}
$queue = array(
	'/'
);
while(count($queue) > 0) {
	$dirPath = array_shift($queue);
	if(null !== $dirPath) {
		if($handle = opendir($fromDir . $dirPath)) {
			while(false !== ($fileName = readdir($handle))) {
				if(('.' !== $fileName) && ('..' !== $fileName)) {
					$fileName = changeEncoding($fileName);
					if("" !== $fileName) {
						$filePath = $dirPath . $fileName;
						$absFromPath = $fromDir . $filePath;
						$absToPath = $toDir . $filePath;
						if(file_exists($absFromPath)) {
							if(is_dir($absFromPath)) {
								if(".svn" !== $fileName) {
									//去除SVN文件
									if(!file_exists($absToPath)) {
										//保证可以建文件夹成功
										mkdir($absToPath,0777);
									}
									array_push($queue,$filePath . '/');
								}
							} else {
								//文件,判定是否最新
								if(!file_exists($absToPath) || (filemtime($absFromPath) > filemtime($absToPath))) {
									copy($absFromPath,$absToPath);
								}
							}
						}
					}
				}
			}
			closedir($handle);
		}
	}
}
echo 'copy successfully !';


你可能感兴趣的:(PHP,复制,文件,明庭令)