上次分享了比较文本的差异,这次来个比较文件
这个类可以比较两个目录中的文件,并找到改变。它遍历两个目录检索的文件列表。这个类可以列出哪些文件被添加,删除或更改。
这个类可以比较两个目录中的文件,并找到改变。
它遍历两个目录检索的文件列表。
这个类可以列出哪些文件被添加,删除或更改。
它遍历两个目录检索的文件列表。
这个类可以列出哪些文件被添加,删除或更改。
<?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>
精彩图集
精彩文章







