使用方法:
- <?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