php实现比较两个文件夹异同的方法


Posted in PHP onJune 18, 2015

本文实例讲述了php实现比较两个文件夹异同的方法。分享给大家供大家参考。具体分析如下:

要求:

只能使用命令行,比较两个文件夹的不同,包括文件的差异。

思考:

虽然linux下有diff。。。。还是用php吧,代码改的方便,速度也很快,以下排除了.svn目录的比较
文件要比较md5校验和

思路:

1)把第一路径作为标准路径,列出第1个路径中有的,第2个路径中没有的文件或文件夹,或者是不同的文件。
2)然后,列出第2个路径中有的,第1个路径中却不存在的文件和文件夹。

调用示例:

php compare_folder.php /home/temp/2 /home/temp/55

代码如下:

<?php 
/** 
 * 工具文件 
 * 目的在于递归比较两个文件夹 
 * 
 * 调用示例 
 * php compare_folder.php /home/temp/2 /home/temp/55 
 * 
 */ 
//参数确定 
if (count($argv) > 1 ) 
 $dir1 = del_postfix($argv[1]); 
else 
 $dir1 = '/'; 
if (count($argv) > 2 ) 
 $dir2 = del_postfix($argv[2]); 
else 
 $dir2 = '/'; 
//检查第一个路径有,后者没有或错误的方法。 
process_compare($dir1, $dir2, 0); 
echo "===========================================================\n"; 
//检查第2个路径的多余文件夹或文件 
process_compare($dir2 , $dir1, 1); 
echo "all OK\n"; 
/** 
 * 去除路径末尾的/,并确保是绝对路径 
 * 
 * @param unknown_type $dir 
 * @return unknown 
 */ 
function del_postfix($dir) 
{ 
 if (!preg_match('#^/#', $dir)) { 
  throw new Exception('参数必须是绝对路径'); 
 } 
 $dir = preg_replace('#/$#', '', $dir); 
 return $dir; 
} 
/** 
 * 公用函数,会调用一个递归方法实现比较 
 * 
 * @param string $dir1 作为标准的路径 
 * @param string $dir2 对比用的路径 
 * @param int $only_check_has 为1表示不比较文件差异,为0表示还要比较文件的md5校验和 
 */ 
function process_compare($dir1, $dir2, $only_check_has){ 
 compare_file_folder($dir1, $dir1, $dir2, $only_check_has); 
} 
/** 
 * 真实的函数,私有函数 
 * 
 * @param string $dir1  路径1,是标准 
 * @param string $base_dir1 不变的参数路径2 
 * @param string $base_dir2 不变的待比较的路径2 
 * @param int $only_check_has 为1表示不比较文件差异,为0表示还要比较文件的md5校验和 
 * 
 */ 
function compare_file_folder($dir1, $base_dir1, $base_dir2, $only_check_has=0){ 
 if (is_dir($dir1)) { 
  $handle = dir($dir1); 
  if ($dh = opendir($dir1)) { 
   while ($entry = $handle->read()) { 
    if (($entry != ".") && ($entry != "..") && ($entry != ".svn")){ 
     $new = $dir1."/".$entry; 
     //echo 'compare: ' . $new . "\n"; 
     $other = preg_replace('#^'. $base_dir1 .'#' , $base_dir2, $new); 
     if(is_dir($new)) { 
      //比较 
      if (!is_dir($other)) { 
       echo '!!not found direction: '. $other. ' (' . $new .")\n"; 
      } 
      compare_file_folder($new, $base_dir1,$base_dir2, $only_check_has) ; 
     } else { //如果1是文件,则2也应该是文件 
      if (!is_file($other)) { 
       echo '!!not found file:  '. $other. ' ('.$new .")\n"; 
      }elseif ($only_check_has ==0 && ( md5_file($other) != md5_file($new) ) ){ 
       echo '!!file md5 error:  '. $other. ' ('.$new .")\n"; 
      } 
     } 
    } 
   } 
   closedir($dh); 
  } 
 } 
} 
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
php读取excel文件示例分享(更新修改excel)
Feb 27 PHP
ThinkPHP视图查询详解
Jun 30 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
php实现中文转数字
Feb 18 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
PHP var关键字相关原理及使用实例解析
Jul 11 PHP
基于php伪静态的实现方法解析
Jul 31 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 #PHP
php实现转换ubb代码的方法
Jun 18 #PHP
php实现的日历程序
Jun 18 #PHP
php实现的验证码文件类实例
Jun 18 #PHP
php实现的简单检验登陆类
Jun 18 #PHP
php实现比较全的数据库操作类
Jun 18 #PHP
php文件操作相关类实例
Jun 18 #PHP
You might like
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
PHP session有效期问题
2009/04/26 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
分析python请求数据
2018/08/19 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
Python Django 命名空间模式的实现
2019/08/09 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
幼儿园家长会邀请函
2014/01/15 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
婚前协议书范本两则
2014/10/16 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
Python学习之os包使用教程详解
2022/03/21 Python