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在字符串中查找指定字符串并删除的代码
Oct 02 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
使用php验证复选框有效性的示例
Nov 13 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
PHP中的Session对象如何使用
Sep 25 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 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处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
JS功能代码集锦
2016/05/04 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
js+audio实现音乐播放器
2020/09/13 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
python算法学习之计数排序实例
2013/12/18 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
在python image 中实现安装中文字体
2020/05/16 Python
浅析Python 责任链设计模式
2020/09/11 Python
Python中qutip用法示例详解
2020/10/02 Python
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
数控专业应届生求职信
2013/11/27 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
市场营销计划书范文
2015/01/16 职场文书
新闻报道稿范文
2015/07/23 职场文书
婚宴新娘致辞
2015/07/28 职场文书
2016年少先队活动总结
2016/04/06 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书