Comment implémenter la comparaison des différences de dossiers en PHP ? Cet article présente principalement la méthode de comparaison des similitudes et des différences entre deux dossiers en PHP, impliquant les compétences d'opération récursive de PHP pour les répertoires et les noms de fichiers. J'espère que cela aide tout le monde.
L'exemple de cet article décrit comment comparer les similitudes et les différences entre deux dossiers en PHP. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :
Exigences :
Vous ne pouvez utiliser la ligne de commande que pour comparer les différences entre deux dossiers, y compris les différences de fichiers.
Réflexion :
Bien qu'il y ait des différences sous Linux. . . . Utilisons PHP. La modification du code est simple et rapide. Ce qui suit exclut la comparaison des répertoires .svn
Les fichiers doivent être comparés avec les sommes de contrôle md5
Idée :
<.>1) Utilisez le premier chemin comme chemin standard et répertoriez les fichiers ou dossiers qui se trouvent dans le premier chemin mais pas dans le deuxième chemin, ou qui sont des fichiers différents.2) Ensuite, listez les fichiers et dossiers qui existent dans le deuxième chemin mais n'existent pas dans le premier chemin.
Exemple d'appel :
php compare_folder.php /home/temp/2 /home/temp/55Le code est le suivant suit :
<?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); } } } ?>
Recommandations associées :
Explication détaillée de la lecture du fichier php méthodes de série
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!