php 合并两个目录及目录中的文件

时间:2016-08-03
本文章向大家分享一个php合并目录及目录中文件的函数,该函数主要使用了文件处理函数is_dir、is_file、file_exists、file_get_contents、basename以及copy函数,需要的朋友可以参考一下。

函数源代码如下:

$source = 'D:/source/';
$target = 'D:/target/';
 
echo copy_merge ( $source, $target );
 
/**
 * 合并目录
 * @param $source 要合并的文件夹
 * @param $target 要合并的目的地
 * @return int 处理的文件数
 */
function copy_merge($source, $target) {
    // 路径处理
    $source = preg_replace ( '#/\\\\#', DIRECTORY_SEPARATOR, $source );
    $target = preg_replace ( '#\/#', DIRECTORY_SEPARATOR, $target );
    $source = rtrim ( $source, DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR;
    $target = rtrim ( $target, DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR;
    // 记录处理了多少文件
    /* http://www.manongjc.com/article/1302.html */
    $count = 0;
    // 如果目标目录不存在,则创建。
    if (! is_dir ( $target )) {
        mkdir ( $target, 0777, true );
        $count ++;
    }
    // 搜索目录下的所有文件
    foreach ( glob ( $source . '*' ) as $filename ) {
        if (is_dir ( $filename )) {
            // 如果是目录,递归合并子目录下的文件。
            $count += copy_merge ( $filename, $target . basename ( $filename ) );
        } elseif (is_file ( $filename )) {
            // 如果是文件,判断当前文件与目标文件是否一样,不一样则拷贝覆盖。
            // 这里使用的是文件md5进行的一致性判断,可靠但性能低,应根据实际情况调整。
            if (! file_exists ( $target . basename ( $filename ) ) || md5 ( file_get_contents ( $filename ) ) != md5 ( file_get_contents ( $target . basename ( $filename ) ) )) {
                copy ( $filename, $target . basename ( $filename ) );
                $count ++;
            }
        }
    }
 
    // 返回处理了多少个文件
    return $count;
}