同步文件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”