文件同步类SimFileSync.class.php

使用方法: 

Java代码  

  1. <?php  
  2. require 'SimFileSync.class.php';  
  3.   
  4. // 新建实例  
  5. $sync = new SimFileSync();  
  6.   
  7. $src = "F:/www/simphp";  
  8. $dest = "F:/www/simphp_sae";  
  9.   
  10. // 设置排除文件夹和文件名  
  11. $sync->set('exclude_dir_array', array(  
  12.     '.svn',  
  13.     '.settings'  
  14. ))->set('exclude_file_array', array(  
  15.         '.project',  
  16.         '.buildpath'  
  17.     ));  
  18.   
  19. // 同步  
  20. $sync->sync($src, $dest);  
  21.   
  22. // 返回同步列表  
  23. print_r($sync->getSync());  

同步类

Java代码  

  1. <?php  
  2. /** 
  3.  * Sim, Simple library simplify our PHP development. 
  4.  * 使用简单、简洁的类库,简化我们的PHP开发。 
  5.  * 
  6.  * @author 雨中歌者 http://weibo.com/esinger (新浪微博) 
  7.  * @link http://blog.csdn.net/esinger (技术博客) 
  8.  * @license http://www.apache.org/licenses/LICENSE-2.0 
  9.  */  
  10.   
  11. /** 
  12.  * 文件同步类 
  13.  * 主要功能: 
  14.  * 1.把源文件夹内所有文件和子文件夹同步到目标文件夹 
  15.  * 2.可以同步到多个文件夹 
  16.  * 3.可以设置同步规则(正则或者数组),指定哪些文件和文件夹不进行同步 
  17.  * 4.返回源文件夹、目标文件夹列表 
  18.  * 5.返回同步的文件列表 
  19.  * 
  20.  * @author 雨中歌者 
  21.  * @version 1.0 
  22.  */  
  23. class SimFileSync  
  24. {  
  25.     /** 
  26.      * 初始配置值 
  27.      * 
  28.      * @var array 
  29.      */  
  30.     private $ini = array(  
  31.         'exclude_dir_pattern' => '',  
  32.         'exclude_file_pattern' => '',  
  33.         'exclude_dir_array' => array(),  
  34.         'exclude_file_array' => array()  
  35.     );  
  36.   
  37.     /** 
  38.      * 源目录名 
  39.      * 
  40.      * @var string 
  41.      */  
  42.     private $src;  
  43.   
  44.     /** 
  45.      * 目标目录名 
  46.      * 
  47.      * @var string 
  48.      */  
  49.     private $dest;  
  50.   
  51.     /** 
  52.      * 源目录数据 
  53.      * 
  54.      * @var array 
  55.      */  
  56.     private $src_data = array();  
  57.   
  58.     /** 
  59.      * 文件同步情况 
  60.      * 
  61.      * @var array 
  62.      */  
  63.     private $sync = array();  
  64.   
  65.     /** 
  66.      * 构造函数 
  67.      */  
  68.     public function __construct()  
  69.     {  
  70.     }  
  71.   
  72.     /** 
  73.      * 设置参数 
  74.      * 1.$name为string,参数键名,$value为参数值,如 set('name','value') 
  75.      * 2.$name为array,参数键值对数组,如 set(array('name'=>'value')) 
  76.      * 
  77.      * @access public 
  78.      * @param string|array $name 参数键名或键值对数组 
  79.      * @param mixed|null $value 参数值 
  80.      * @return SimFileSync 
  81.      */  
  82.     public function set($name, $value = null)  
  83.     {  
  84.         if (is_array($name)) {  
  85.             $this->ini = array_merge($this->ini, $name);  
  86.         } elseif (is_string($name)) {  
  87.             $this->ini[$name] = $value;  
  88.         }  
  89.         return $this;  
  90.     }  
  91.   
  92.     /** 
  93.      * 同步 
  94.      * 
  95.      * @access public 
  96.      * @param string $src 源文件目录 
  97.      * @param string $dest 目标文件目录 
  98.      * @return array 
  99.      */  
  100.     public function sync($src, $dest)  
  101.     {  
  102.         $this->src = rtrim($src, '/\\') . '/';  
  103.         $this->dest = rtrim($dest, '/\\') . '/';  
  104.         $this->src_data = $this->getFile($src);  
  105.         foreach ($this->src_data as $file => $type) {  
  106.             $dest = str_replace($this->src, $this->dest, $file);  
  107.             if ($type == 'dir' && !is_dir($dest)) {  
  108.                 // 目录不存在,创建目录  
  109.                 mkdir($dest, 0777, true);  
  110.                 $this->sync[$file] = 'mkdir';  
  111.             } elseif ($type == 'file') {  
  112.                 if (!is_file($dest)) {  
  113.                     // 目标文件不存在,复制文件  
  114.                     $dir = dirname($dest);  
  115.                     is_dir($dir) or mkdir($dir, 0777, true);  
  116.                     copy($file, $dest);  
  117.                     $this->sync[$file] = 'newfile';  
  118.                 } else {  
  119.                     if (md5_file($file) != md5_file($dest)) {  
  120.                         // 目标文件存在,但修改时间不一样,覆盖文件  
  121.                         copy($file, $dest);  
  122.                         $this->sync[$file] = 'rewrite';  
  123.                     }  
  124.                 }  
  125.             }  
  126.         }  
  127.     }  
  128.   
  129.     /** 
  130.      * 返回同步的文件列表 
  131.      * 
  132.      * @access public 
  133.      * @return array 
  134.      */  
  135.     public function getSync()  
  136.     {  
  137.         return $this->sync;  
  138.     }  
  139.   
  140.     /** 
  141.      * 获取目录下的所有目录和文件 
  142.      * 
  143.      * @access public 
  144.      * @param string $dirname 
  145.      * @return array 不是目录或目录打开失败返回空数组 
  146.      */  
  147.     public function getFile($dirname)  
  148.     {  
  149.         $dirname = rtrim($dirname, '/\\');  
  150.         $ret = array();  
  151.         if (is_dir($dirname)) {  
  152.             if (($dh = @opendir($dirname)) !== false) {  
  153.                 while (false !== ($file = readdir($dh))) {  
  154.                     if ($file != "." && $file != "..") {  
  155.                         $path = $dirname . '/' . $file;  
  156.                         if (is_dir($path)) {  
  157.                             if (!$this->isExcluded($path, 'dir')) {  
  158.                                 $ret[$path] = 'dir';  
  159.                                 $ret = array_merge($ret, $this->getFile($path));  
  160.                             }  
  161.                         } else {  
  162.                             if (!$this->isExcluded($path, 'file')) {  
  163.                                 $ret[$path] = 'file';  
  164.                             }  
  165.                         }  
  166.                     }  
  167.                 }  
  168.                 closedir($dh);  
  169.             }  
  170.         }  
  171.         return $ret;  
  172.     }  
  173.   
  174.     /** 
  175.      * 是否被排除文件 
  176.      * 
  177.      * @access private 
  178.      * @param string $filename 文件名 
  179.      * @param boolean $type 目录或者文件(dir|file) 
  180.      * @return boolean 
  181.      */  
  182.     private function isExcluded($filename, $type)  
  183.     {  
  184.         $filename = basename($filename);  
  185.         $pattern = $this->ini["exclude_{$type}_pattern"];  
  186.         $array = $this->ini["exclude_{$type}_array"];  
  187.         if ((!empty($pattern) && preg_match($pattern, $filename)) || in_array($filename, $array)) {  
  188.             return true;  
  189.         }  
  190.         return false;  
  191.     }  
  192.   
  193.     /** 
  194.      * * 析构函数 
  195.      */  
  196.     public function __destruct()  
  197.     {  
  198.         unset($this->ini);  
  199.     }  
  200. }  
  201. // End of file SimFileSync.class.php  

 

时间: 2024-12-21 20:33:12

文件同步类SimFileSync.class.php的相关文章

php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)_php技巧

php使用ftp实现文件上传代码片段: <?php /** * ftp上传文件类 */ class Ftp { /** * 测试服务器 * * @var array */ private $testServer = array( 'host' => 'ip', 'port' => 21, 'user' => 'userName', 'pwd' => 'password' ); /** * 打开并登录服务器 * * @param string $flag 服务器标识test *

利用Rsync服务让SLB下多台centos服务器文件同步更新

利用Rsync服务让SLB下多台centos服务器文件同步更新 因为易淘帮使用了SLB负载均衡,为了保证SLB下两台服务器下面的网站文件同步,易淘帮采用了rsync服务进行同步,并进行了每三分钟同步一次.根据这样操作可以完美的使用slb服务,实现负载均衡.容灾恢复. 一. 介绍 rsync – remote synchronize是类unix系统下的数据镜像备份工具,它的特性如下: 1. 可以镜像保存整个目录树和文件系统. 2. 可以很容易做到保持原来文件的权限.时间.软硬链接等等. 3. 无须

一分钟了解阿里云产品:利用Rsync服务SLB下多台centos服务器网站文件同步更新

易淘帮使用了SLB负载均衡,为了保证SLB下两台服务器下面的网站文件同步,易淘帮采用了rsync服务进行同步,每三分钟进行同步一次.   简单介绍下reync,rsync-remote synchronize是类unix系统下的数据镜像备份工具,它的特性如下: 1.  可以镜像保存整个目录树和文件系统. 2.  可以很容易做到保持原来文件的权限.时间.软硬链接等等. 3.  无须特殊权限即可安装. 4.  快速:第一次同步rsync会复制全部内容,当在下一次只传输修改过的文件.Rsync在传输数

关于数据库和文件同步写入的问题

问题描述 有个关于数据库和文件同步写入的问题想请教下各位,我想将信息插入数据库的同时将此处信息同步写入到文件中,请问有什么类似于事务的方式能保证同步吗?即如果数据库插入失败的话,不会将信息写入到文件中:同时如果文件写入失败的话,也不会将信息插入到数据库中. 类似的,如果执行多个文件操作,将信息写入file1.file2.file3中,有什么方式能保证在file3写入失败时file1.file2不会被写入. 谢谢各位赐教! 解决方案 你想实现插入数据库的同时又写入文件,开启线程呗 同时完成若不是同

服务器文件同步管理

原文 http://www.cnblogs.com/yanxiaodi/archive/2011/03/21/2296462.html 前几天有台服务器电源坏了,还好数据没有丢.因此必须做好服务器文件内容的备份.服务器主要是用来提供网站服务,带着一个数据库,数据库可以用分发和订阅来解决,网页文件开发电脑也有备份,因此重点在上传的文件部分.   手动上传复制备份的方法显然不可行,需要做到自动将上传的文件同步到另一台服务器上.   找到了一个免费开源的文件同步工具:  FreeFileSync,官方

Rsync 服务器文件同步的搭建以及使用_服务器其它

rsync 是类unix系统下的数据镜像备份工具, 它可以镜像保存整个目录树和文件系统.并且很容易做到保持原文件的权限,时间,软硬链接等等. 无须特殊权限即可安装. 特点: 快速.  第一次同步时会复制全部内容,但在下一次他只传修改过的文件,并且在传输过程中可以实行压缩及解压缩操作,因此可以使用更少带宽.安全. 可以使用scp.ssh等方式来传输文件,当然也可以通过直接的socket链接支持匿名传输,以方便进行网站镜像. 首先 下载安装包 复制代码 代码如下: wget http://rsync

文件同步工具

转载:http://www.cnblogs.com/yanxiaodi/archive/2011/03/21/2296462.html   服务器文件同步管理 前几天有台服务器电源坏了,还好数据没有丢.因此必须做好服务器文件内容的备份.服务器主要是用来提供网站服务,带着一个数据库,数据库可以用分发和订阅来解决,网页文件开发电脑也有备份,因此重点在上传的文件部分. 手动上传复制备份的方法显然不可行,需要做到自动将上传的文件同步到另一台服务器上. 找到了一个免费开源的文件同步工具: FreeFile

Rsync服务让SLB下多台centos服务器文件同步更新

需求目的 是为了使俩台集群下的俩台服务器 实现数据同步 及真正的备份 所以负载均衡 加上rsync是一个完美的结合 下面的操作是针对阿里云的SLB 服务,SLB服务 是由tengine与lvs所组成的 所以在其他环境下也可以使用这种方式,所以操作如下: 当使用了SLB负载均衡,为了保证SLB下两台服务器下面的网站文件同步,所以采用了rsync服务进行同步,并进行了每三分钟同步一次.根据这样操作可以完美的使用slb服务,实现负载均衡.容灾恢复 等.. rsync – remote synchron

用java写的一个文件操作类包

前几天仔细看了看java的I/O操作,呵呵.就写了一个操作文件的类包,功能有创建文件或目录,删除文件或目录,复制文件或目录,移动文件或目录,设置文件或目录属性,查看文件或目录大小.呵呵,功能比较简单,源代码为: 创建: Java代码 package fileOperation; import java.io.File; import java.io.FileOutputStream; /** * @author wakin * */ public class Create { /**根据字符串生