`
hudeyong926
  • 浏览: 2034787 次
  • 来自: 武汉
社区版块
存档分类
最新评论

文件同步类SimFileSync.class.php

 
阅读更多

使用方法: 

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

 

 
分享到:
评论

相关推荐

    UploadFile.class.php支持多文件上传的上传类

    UploadFile.class.php支持多文件上传的上传类 说明:支持多文件上传的上传类 使用方法: include '../UploadFile.class.php'; $upload=new UploadFile(); if(!$upload-&gt;upload()) { // 上传错误提示错误信息 $...

    PHP类,....class.php非常不错

    整理了一些PHP的类,希望能对大家有所帮助 activeCodeObj.class.php ascii.class.php book.class.php cache2.class.php database.class.php file_dir.class.php . . . . . .

    Java反编译工具把.class文件转换为.java文件

    - 递归处理子目录:若想对整个包含多个子目录的项目进行反编译,可以使用`-r`选项,例如:`jad -r -d srctree/**/*.class`将递归地处理`tree`目录及其所有子目录下的`.class`文件,并根据类所在的包名称创建对应的...

    SoapDiscovery.class.php

    SoapDiscovery.class.php

    么把.class文件反编译成.java 经修改后再编译成.class

    下面将详细介绍.class 文件反编译到.java 文件的过程,包括反编译工具的使用和反编译后的修改、再编译等步骤。 一、反编译工具的选择 在反编译.class 文件时,需要使用专门的反编译工具。目前有多种反编译工具可供...

    java反编译工具(.class文件反编译成.java文件)

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...

    class文件编译器.zip

    每个类定义都会对应一个`.class`文件,如果源文件中有多个public类,那么需要额外的 `-d` 参数指定输出目录,以避免文件重命名冲突。 4. **类加载器与字节码执行**: JVM使用类加载器加载`.class`文件,然后解析...

    很牛叉的文件上传类class.upload.php

    《很牛叉的文件上传类class.upload.php》 在IT领域,文件上传是常见的功能需求,无论是用户在网站上提交照片、文档还是其他类型的文件,都需要处理文件上传的问题。在这个场景下,`class.upload.php`就是一个强大的...

    实现用邮件找回密码的类文件mail.class.php类-Smtp.class.php

    学无止境,学会整理我们经常使用的学习类库文件,加油!

    java.class文件反编译工具【免费】

    Java 类(.class)文件是Java程序编译后的二进制形式,它们包含了机器可执行的指令和数据结构。为了查看这些二进制文件中的源代码或者理解其工作原理,我们需要借助反编译工具。本资源提供的是一款名为JD-GUI的免费...

    删除.class文件

    可以批量删除.class文件,点击右键操作就可以了,简单

    mysql数据库类 mysql.class.php

    数据库类,mysql.class.php

    .class文件反编译工具。 .class文件转java文件

    每个`.class`文件都是Java虚拟机(JVM)能够识别和执行的二进制格式,它包含了类、接口、字段和方法的定义,以及相关的元数据。由于`.class`文件是二进制的,所以直接阅读并不直观,这就需要反编译工具将它们转换回...

    韩顺平SqlHelper.class.php工具类 等学习资料

    SqlHelper.class.php MyMiniSmarty.class.php emManage.php FenyePage.class.php Emp.class.php EmpModel.class.php Message.class.php Message.class.php MessageModel.class.php ............... 由于我...

    java .class 类反编译软件

    在这种需求下,出现了专门用于反编译Java字节码的工具,例如XJad,它是一个古老的类反编译器,可以将`.class`文件转换回`.java`源代码格式。 首先,我们需要理解Java的编译过程。当开发者编写完`.java`源代码后,会...

    Snoopy.class.php类及中文说明

    在实际使用中,首先需要将Snoopy.class.php文件引入到PHP脚本中,然后创建Snoopy对象,配置相关参数,如URL、请求类型、头部信息等,最后调用相应的请求方法执行请求。获取到服务器的响应后,可以利用Snoopy提供的...

    韩顺平老师SqlHelper.class.php

    韩顺平老师讲Smarty知识时的SqlHelper.class.php 目前较全的SqlHelper.class.php

    php webservice SoapDiscovery.class.php

    包含完整的SoapDiscovery.class.php类 还包含一个写好的完整的php webservice 实例

    thinkphp文件处理类Dir.class.php的用法分析

    在ThinkPHP框架中,文件处理类`Dir.class.php`提供了对目录和文件操作的便捷方法。这个类在处理文件系统任务时非常有用,比如清理缓存、管理文件等。在这个例子中,我们主要关注如何使用`Dir.class.php`中的`del`...

Global site tag (gtag.js) - Google Analytics