zoukankan      html  css  js  c++  java
  • 同步文件PHP常用类库:文件同步类SimFileSync.class.php

    首先声明,我是一个菜鸟。一下文章中出现技巧误导况情盖不负责

        主要功能:

     * 1.把源文件夹内部全文件和子文件夹同步到标目文件夹

     * 2.可以同步到多个文件夹

     * 3.可以设置同步规矩,指定哪些文件和文件夹不进行同步

     * 4.返回源文件夹、标目文件夹表列

     * 5.返回同步的文件表列

        型典用法:

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

    文章结束给大家分享下程序员的一些笑话语录: 警告
    有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他 说, “你知道不知道这个东西会危害你的健康?我是说, 你有没有注意到香烟 盒上的那个警告(Warning)?”
    小伙子说,“没事儿,我是一个程序员”。
    那妇女说,“这又怎样?”
    程序员说,“我们从来不关心 Warning,只关心 Error”

  • 相关阅读:
    Django框架之数据库ORM框架
    Django模块之jinja2模版
    Django框架之中间件MiddleWare
    Django框架之类视图
    Django框架之session
    Django框架之cookies
    Django框架之给客户端返回数据
    Django框架之获取客户端发送的数据
    题解 UVA11475 【Extend to Palindrome】
    题解 P3964 【[TJOI2013]松鼠聚会】
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3036041.html
Copyright © 2011-2022 走看看