龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

上次分享了比较文本的差异,这次来个比较文件

时间:2014-07-22 14:48来源: 作者: 点击:
分享到:
这个类可以比较两个目录中的文件,并找到改变。它遍历两个目录检索的文件列表。这个类可以列出哪些文件被添加,删除或更改。
这个类可以比较两个目录中的文件,并找到改变。

它遍历两个目录检索的文件列表。

这个类可以列出哪些文件被添加,删除或更改。
<?php
/*
* http://www.codepearl.com
*/
class compare
{
	
	private $source;
	private $update;
	private $removed = array();
	private $added = array();
	private $changed = array();
		
	public function __construct(){
	}
	
	public function set_source($source) {
		$this->source = $source;
	}
	
	public function set_update($update) {
		$this->update = $update;
	}
	
	public function get_source() {
		return $this->source;
	}
	
	public function get_update() {
		return $this->update;
	}
	
	public function get_removed() {
		return $this->removed;
	}
	
	public function get_added() {
		return $this->added;
	}
	
	public function get_changed() {
		return $this->changed;
	}
	
	public function do_compare(){
	    $source = Array();
	    $destination = Array();
	    $currentDirectory = getcwd();
	    $workingDir = '';
	    chdir($this->source);
	    $source = $this->doTree('.', $source);
	    if (!is_array($source)) return;
	    chdir ($this->update);
	    $destination = $this->doTree('.', $destination);
	    if (!is_array($destination)) exit;
	    chdir($currentDirectory);
	    foreach ($source as $dir => $value) {
	        foreach($value as $file => $hash) {
	            if (isset($destination[$dir][$file])) {
	                if ($hash != $destination[$dir][$file]) {
	                    $this->changed[] = $dir.'/'.$file;
	                }
	            } else {
	                $this->removed[] = $dir.'/'.$file;
	            }
	        }
	    }
	    foreach ($destination as $dir => $value) {
	        foreach($value as $file => $hash) {
	            if (!isset($source[$dir][$file])) {
	                $this->added[] = $dir.'/'.$file;
	            }
	        }
	    }
	}
	
	private function checksum($file) {
	    $ignores = Array(10, 13);
	    $fh = fopen($file, 'r');
	    $buffer = '';
	    while (!feof($fh)) {
	        $buffer .= fgets($fh);
	    }
	    fclose ($fh);
	    foreach ($ignores as $ignore) {
	        while (strpos($buffer, chr($ignore))) {
	            $buffer = str_replace(chr($ignore), '', $buffer);
	        }
	    }
	    return hash('crc32', $buffer).hash('crc32b', $buffer);
	}
	
	private function doTree($dir, &$array) {
	    if (stripos($dir, 'checksum') !== false
	     || stripos($dir, 'cache')  !== false
	     || stripos($dir, 'import')  !== false
	     || stripos($dir, 'custom')  !== false
	     || stripos($dir, '_notes')  !== false
	     || stripos($dir, '.svn') !== false) {
	        return $array;
	    }
	    $filetypes = Array('php', 'js', 'htm', 'html', 'css', 'tpl', 'ini', 'txt');
	    if ($dh = opendir($dir)) {
	        while ($file = readdir($dh)) {
	            if ($file != '.' && $file != '..') {
	                if (is_dir($dir.'/'.$file)) {
	                    if (count($array) == 0) $array[0] = 'Temp';
	                    if (!$this->doTree($dir.'/'.$file, $array)) {
	                        return false;
	                    }
	                } else {
	                    if (filesize($dir.'/'.$file)) {
	                        foreach ($filetypes as $type) {
	                            if (strpos($file.'|', '.'.$type.'|') != 0 ) {
	                                set_time_limit(30);
	                                $array[$dir][$file] = $this->checksum( $dir.'/'.$file ); //md5_file($dir.'/'.$file, false);
	                            }
	                        }
	                    }
	                }
	            }
	        }
	        if (count($array) > 1  && isset($array['0'])) unset($array['0']);
	        return $array;
	    } else {
	        echo 'error opening '.$dir.'</h3>';
	        return false;
	    }
	}

}
 

2. [代码]使用方法     跳至 [1] [2] [全屏预览]

<?php
/*
* http://www.codepearl.com
*/
?>
<html>

<head>
<title>http://www.codepearl.com</title>
</head>
<body>
<h1 align="center">Upgrade checker</h1>
<?php
    include ('compare.class.php');		// Load the class
    $cmp = new compare();				// Initialize the class
    $dir = dirname(__FILE__);
    $cmp->set_source($dir.'\Source');	// Directory where Source files are
    $cmp->set_update($dir.'\Update');	// Directory where pristeen files are
    $cmp->do_compare();					// Do the compare
    $removed = $cmp->get_removed();		// Get the results
    $added = $cmp->get_added();			// ...
    $changed = $cmp->get_changed();		// ...
    echo '<h3>Files Changed</h3>';		// Display the results
    foreach($changed as $file) {
        echo $file.' has been changed<br>';
    }
    echo '<h3>Files Added</h3>';
    foreach ($added as $add) {
        echo $add.'<br>';
    }
    echo '<h3>Files Removed</h3>';
    foreach ($removed as $remove) {
        echo $remove.'<br>';
    }
    
?>
</body>
</html>

3. [图片] QQ截图20131114101704.jpg    

精彩图集

赞助商链接