2016年7月13日 星期三

比較兩個目錄內的檔案及內容


臨危受命去處理一個項目的上線工作。由於程序是由前人編寫,在沒有交帶、沒有文件之下要處理無誤,需要細心的計劃。為了能有效及成功地完成工作,我編寫了一個簡單的程式,用來找出 UAT 及 Production 伺服器內不同內容的檔案:
<?php
//----------------------------------------------------------------------------------------
//  File Compare
//----------------------------------------------------------------------------------------
//  Written by Pacess HO
//  Copyright 2016 Pacess Studio.  All rights reserved.
//----------------------------------------------------------------------------------------
 
//----------------------------------------------------------------------------------------
function getDirectoryArray($directory)  {
   $resultArray = array(); 
   $fileArray = scandir($directory); 
   foreach ($fileArray as $key => $value)  {
 
      //  Skip . & ..
      if (in_array($value, array(".", "..")))  {continue;}
 
      $filePath = $directory.DIRECTORY_SEPARATOR.$value;
      if (is_dir($filePath) == false)  {array_push($resultArray, $filePath);}
      else  {
 
         $subdirectoryArray = getDirectoryArray($filePath);
         $resultArray = array_merge($resultArray, $subdirectoryArray);
      }
   } 
   return $resultArray; 
} 
 
//=========================================================================================
//  Main program
//----------------------------------------------------------------------------------------
echo("\n");
echo("-----------------------------------------------------------\n");
echo("--  File Compare v1.00                                   --\n");
echo("--  Written by Pacess HO                                 --\n");
echo("--  Copyright 2016 Pacess Studio.  All rights reserved.  --\n");
echo("-----------------------------------------------------------\n");

$folder01 = "uat";
$folder02 = "production";

$fileArray01 = getDirectoryArray($folder01);
$fileArray02 = getDirectoryArray($folder02);

sort($fileArray01);
sort($fileArray02);

$fileCount01 = count($fileArray01);
$fileCount02 = count($fileArray02);
echo("\nFile count: $fileCount01 vs $fileCount02\n\n");

$index01 = 0;
$index02 = 0;
$counter = 0;
while ($counter < 10000)  {
   $counter++;

   $filePath01 = "";
   $filePath02 = "";

   if ($fileCount01 > $index01)  {$filePath01 = $fileArray01[$index01];}
   if ($fileCount02 > $index02)  {$filePath02 = $fileArray02[$index02];}

   //  Compare file name first
   if ($filePath01 == "" && $filePath02 == "")  {break;}

   $filename01 = str_replace($folder01, "", $filePath01);
   $filename02 = str_replace($folder02, "", $filePath02);

   $result = strcmp($filename01, $filename02);
   if ($result != 0)  {

      //  File name not match, so ... 
      if ($result < 0)  {
         if ($filePath01 == "")  {
            echo("$filePath02 ... [$folder02 only]\n");
            $index02++;
         }  else  {
            echo("$filePath01 ... [$folder01 only]\n");
            $index01++;
         }
      }  else  {
         if ($filePath02 == "")  {
            echo("$filePath01 ... [$folder01 only]\n");
            $index01++;
         }  else  {
            echo("$filePath02 ... [$folder02 only]\n");
            $index02++;
         }
      }
      continue;
   }

   //  Same file name, then check file size first
   $index01++;
   $index02++;

   $fileSize01 = filesize($filePath01);
   $fileSize02 = filesize($filePath02);
   if ($fileSize01 != $fileSize02)  {
      echo("$filePath01 ... [Size: $fileSize01 vs $fileSize02]\n");
      continue;
   }

   //  Same file name with same file size
   if ($fileSize01 == 0)  {
      echo("$filePath01 ... [Size: 0]\n");
      continue;
   }

   //  Same file name with same file size, then compare content
   $md5File01 = md5_file($filePath01);
   $md5File02 = md5_file($filePath02);

   $result = strcmp($md5File01, $md5File02);
   if ($result != 0)  {
      echo("$filePath01 ... [Content mismatch]\n");
      continue;
   }
}
echo("~ End ~\n\n");
?>

沒有留言: