檔案同步類SimFileSync.class.php

航空母艦發表於2015-07-13

使用方法: 

<?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

 

 

相關文章