この記事では、phpで2つのフォルダーの類似点と相違点を比較する方法の例について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:
要件:
ファイルの違いを含め、2 つのフォルダー間の違いを比較するには、コマンド ラインのみを使用できます。
考え中:
Linux下ではdiffはありますが。 。 。 。コードの修正は簡単かつ迅速に PHP を使用しましょう。以下では .svn ディレクトリの比較は省略します。
ファイルは md5 チェックサムと比較する必要がありますアイデア:
1) 最初のパスを標準パスとして使用し、最初のパスにはあるが 2 番目のパスには存在しない、または異なるファイルであるファイルまたはフォルダーをリストします。
2) 次に、2 番目のパスには存在するが、1 番目のパスには存在しないファイルとフォルダーをリストします。
通話例:
php Compare_folder.php /home/temp/2 /home/temp/55
コードは次のとおりです:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
/** * ツールファイル * 目的は 2 つのフォルダーを再帰的に比較することです * *通話例 * php Compare_folder.php /home/temp/2 /home/temp/55 * */ //パラメータが決定されました if (count($argv) > 1 ) $dir1 = del_postfix($argv[1]); その他 $dir1 = '/'; if (count($argv) > 2 ) $dir2 = del_postfix($argv[2]); その他 $dir2 = '/'; //最初のパスが存在することを確認し、後者は存在しないか、間違っていることを確認します。 process_compare($dir1, $dir2, 0); エコー「============================================= = ============n"; //余分なフォルダーまたはファイルがないか 2 番目のパスを確認します process_compare($dir2, $dir1, 1); 「すべて OKn」をエコーします; /** * パスの末尾の / を削除し、絶対パスであることを確認してください * * @param 不明なタイプ $dir * @return 不明 */ 関数 del_postfix($dir) { if (!preg_match('#^/#', $dir)) { throw new Exception('パラメータは絶対パスである必要があります'); } $dir = preg_replace('#/$#', '', $dir); $dir を返す; } /** * 比較を実装するために再帰的メソッドを呼び出すパブリック関数 * * @param string $dir1 を標準パスとして使用します * @param string $dir2 比較に使用されるパス * @param int $only_check_has 1の場合はファイルの差分を比較しないことを意味し、0の場合はファイルのmd5チェックサムも比較することを意味します */ 関数 process_compare($dir1, $dir2, $only_check_has){ compare_file_folder($dir1, $dir1, $dir2, $only_check_has); } /** * 実関数、プライベート関数 * * @param string $dir1 path 1、標準です * @param string $base_dir1 パラメータパス 2 は変更されません * @param string $base_dir2 比較対象のパス 2 は変更されていません * @param int $only_check_has 1 の場合、ファイルの差分を比較しないことを意味し、0 の場合、ファイルの md5 チェックサムも比較する必要があることを意味します * */ 関数 Compare_file_folder($dir1, $base_dir1, $base_dir2, $only_check_has=0){ if (is_dir($dir1)) { $ハンドル = dir($dir1); if ($dh = opendir($dir1)) { while ($entry = $handle->read()) { if (($entry != ".") && ($entry != "..") && ($entry != ".svn")){ $new = $dir1."/".$entry; //echo '比較: ' 。 $new 。 「ん」; $other = preg_replace('#^'. $base_dir1 .'#' , $base_dir2, $new); if(is_dir($new)) { //比较 if (!is_dir($other)) { エコー「!!方向が見つかりません: 」。 $その他。 ' (' . $new .")n"; } compare_file_folder($new, $base_dir1,$base_dir2, $only_check_has) ; } else { //如果1は文件,则2也应该は文件です if (!is_file($other)) { エコー「!!ファイルが見つかりません: 」。 $その他。 ' ('.$new .")n"; }elseif ($only_check_has ==0 && ( md5_file($other) != md5_file($new) ) ){ エコー「!!ファイル md5 エラー: 」。 $その他。 ' ('.$new .")n"; } } } } closedir($dh); } } } ?> |
ここに記載されている大家のphpプログラムの設計に役立つことを希望します。
http://www.bkjia.com/PHPjc/1018932.html