`
hudeyong926
  • 浏览: 2016388 次
  • 来自: 武汉
社区版块
存档分类
最新评论

文件同步类SimFileSync.class.php

阅读更多

使用方法: 

<?php
require 'SimFileSync.class.php';

// 新建实例
$sync = new SimFileSync();

$src = "F:/www/simphp";
$dest = "F:/www/simphp_sae";

// 设置排除文件夹和文件名
$sync->set('exclude_dir_array', array(
    '.svn',
    '.settings'
))->set('exclude_file_array', array(
        '.project',
        '.buildpath'
    ));

// 同步
$sync->sync($src, $dest);

// 返回同步列表
print_r($sync->getSync());

同步类

<?php
/**
 * Sim, Simple library simplify our PHP development.
 * 使用简单、简洁的类库,简化我们的PHP开发。
 *
 * @author 雨中歌者 http://weibo.com/esinger (新浪微博)
 * @link http://blog.csdn.net/esinger (技术博客)
 * @license http://www.apache.org/licenses/LICENSE-2.0
 */

/**
 * 文件同步类
 * 主要功能:
 * 1.把源文件夹内所有文件和子文件夹同步到目标文件夹
 * 2.可以同步到多个文件夹
 * 3.可以设置同步规则(正则或者数组),指定哪些文件和文件夹不进行同步
 * 4.返回源文件夹、目标文件夹列表
 * 5.返回同步的文件列表
 *
 * @author 雨中歌者
 * @version 1.0
 */
class SimFileSync
{
    /**
     * 初始配置值
     *
     * @var array
     */
    private $ini = array(
        'exclude_dir_pattern' => '',
        'exclude_file_pattern' => '',
        'exclude_dir_array' => array(),
        'exclude_file_array' => array()
    );

    /**
     * 源目录名
     *
     * @var string
     */
    private $src;

    /**
     * 目标目录名
     *
     * @var string
     */
    private $dest;

    /**
     * 源目录数据
     *
     * @var array
     */
    private $src_data = array();

    /**
     * 文件同步情况
     *
     * @var array
     */
    private $sync = array();

    /**
     * 构造函数
     */
    public function __construct()
    {
    }

    /**
     * 设置参数
     * 1.$name为string,参数键名,$value为参数值,如 set('name','value')
     * 2.$name为array,参数键值对数组,如 set(array('name'=>'value'))
     *
     * @access public
     * @param string|array $name 参数键名或键值对数组
     * @param mixed|null $value 参数值
     * @return SimFileSync
     */
    public function set($name, $value = null)
    {
        if (is_array($name)) {
            $this->ini = array_merge($this->ini, $name);
        } elseif (is_string($name)) {
            $this->ini[$name] = $value;
        }
        return $this;
    }

    /**
     * 同步
     *
     * @access public
     * @param string $src 源文件目录
     * @param string $dest 目标文件目录
     * @return array
     */
    public function sync($src, $dest)
    {
        $this->src = rtrim($src, '/\\') . '/';
        $this->dest = rtrim($dest, '/\\') . '/';
        $this->src_data = $this->getFile($src);
        foreach ($this->src_data as $file => $type) {
            $dest = str_replace($this->src, $this->dest, $file);
            if ($type == 'dir' && !is_dir($dest)) {
                // 目录不存在,创建目录
                mkdir($dest, 0777, true);
                $this->sync[$file] = 'mkdir';
            } elseif ($type == 'file') {
                if (!is_file($dest)) {
                    // 目标文件不存在,复制文件
                    $dir = dirname($dest);
                    is_dir($dir) or mkdir($dir, 0777, true);
                    copy($file, $dest);
                    $this->sync[$file] = 'newfile';
                } else {
                    if (md5_file($file) != md5_file($dest)) {
                        // 目标文件存在,但修改时间不一样,覆盖文件
                        copy($file, $dest);
                        $this->sync[$file] = 'rewrite';
                    }
                }
            }
        }
    }

    /**
     * 返回同步的文件列表
     *
     * @access public
     * @return array
     */
    public function getSync()
    {
        return $this->sync;
    }

    /**
     * 获取目录下的所有目录和文件
     *
     * @access public
     * @param string $dirname
     * @return array 不是目录或目录打开失败返回空数组
     */
    public function getFile($dirname)
    {
        $dirname = rtrim($dirname, '/\\');
        $ret = array();
        if (is_dir($dirname)) {
            if (($dh = @opendir($dirname)) !== false) {
                while (false !== ($file = readdir($dh))) {
                    if ($file != "." && $file != "..") {
                        $path = $dirname . '/' . $file;
                        if (is_dir($path)) {
                            if (!$this->isExcluded($path, 'dir')) {
                                $ret[$path] = 'dir';
                                $ret = array_merge($ret, $this->getFile($path));
                            }
                        } else {
                            if (!$this->isExcluded($path, 'file')) {
                                $ret[$path] = 'file';
                            }
                        }
                    }
                }
                closedir($dh);
            }
        }
        return $ret;
    }

    /**
     * 是否被排除文件
     *
     * @access private
     * @param string $filename 文件名
     * @param boolean $type 目录或者文件(dir|file)
     * @return boolean
     */
    private function isExcluded($filename, $type)
    {
        $filename = basename($filename);
        $pattern = $this->ini["exclude_{$type}_pattern"];
        $array = $this->ini["exclude_{$type}_array"];
        if ((!empty($pattern) && preg_match($pattern, $filename)) || in_array($filename, $array)) {
            return true;
        }
        return false;
    }

    /**
     * * 析构函数
     */
    public function __destruct()
    {
        unset($this->ini);
    }
}
// End of file SimFileSync.class.php

 

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics