文件同步类SimFileSync.class.php-阿里云开发者社区

开发者社区> 航空母舰> 正文

文件同步类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, 0777true);  
  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, 0777true);  
  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  

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据同步框架MS Sync Framework - IDE快速开发支持Local Database Cache
数据同步框架MS Sync Framework [术语、例子、参考资料、Tips] http://www.cnblogs.com/2018/archive/2011/02/22/1961654.html  数据同步框架MS Sync Framework-不同场景使用例子和简要分析 http://www.cnblogs.com/2018/archive/2011/02/23/1961657.html 以上两篇文章对框架的基础有了描述,通过IDE的提供Local Database Cache可以快速的实现一个常用的同步应用。
732 0
带你读《存储漫谈Ceph原理与实践》第三章接入层3.3.文件存储 CephFS(四)
带你读《存储漫谈Ceph原理与实践》第三章接入层3.3.文件存储 CephFS
18 0
Lsyncd - 实时文件同步工具(精译)
原文: http://axkibe.github.io/lsyncd/ 描述 Lsyncd监视本地目录树事件监视器接口(inotify或fsevents)。它聚集并组合事件几秒钟,然后生成一个(或多个)进程(es)来同步这些更改。
2431 0
Java对文件的读、写随机访问,RandomAccessFile类的使用分析
  在网上看了一些关于java中的RandomAccessFile类的介绍,又经过查看Java API和自己编的测试程序,总算是对RandomAccessFile的使用有了一定的了解。自己做了以下比较详细的总结吧。
998 0
linux应用之文件实时同步(sersync)
http://hi.baidu.com/johntech/blog/item/be8559d2ebc99282a1ec9c18.html   公司最近业务需求,要实时同步windows与linux,linux与linux之间的数据。
1108 0
【技术贴】​用程序调用福昕阅读器打开pdf文件|解决C:\Program files不是内部或外部命
【技术贴】调用福昕阅读器的命令行方式打开pdf文件|解决C:\Program files中间有空格 不是内部或外部命令。   一 首先是解决路径中含有空格的这个问题,你可以把它当做环境变量写进path里面,或者像我一样,在路径外面套上双引号,如图。
933 0
JVM加载class文件的原理机制
Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。
745 0
+关注
514
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载