static void Main(string[] args) { // Create two identical or different temporary folders on a local drive and change these file paths. string OldDirectory = "d"; string NewDirectory = "d"; string LogFileDate = DateTime.Now.ToString("yyyyMMddHHmmss"); WriteToLog("Directory Differential v1.0 executed", LogFileDate + "-DirectoryDiff.log"); if (args.Length == 0 || ((args[0] == "/?" | args[1] == "-?") & args.Length == 1)) { Console.WriteLine(); Console.WriteLine(); Console.WriteLine("DirectoryDiff v1.0 by SONNY"); Console.WriteLine("Compares contents of New Directory against an Old Directory"); Console.WriteLine(); Console.WriteLine("Next time, speed this up by passing arguments like this..."); Console.WriteLine("usage: directorydiff.exe <New Directory> <Old Directory>"); } if (args.Length != 2 || !Directory.Exists(".\\" + args[0]) | !Directory.Exists(".\\" + args[1])) { Console.WriteLine("Only 2 relative path directories can be compared..."); while (!Directory.Exists(".\\" + OldDirectory)) { Console.Write("Old directory:"); OldDirectory = Console.ReadLine(); if (!Directory.Exists(".\\" + OldDirectory)) { Console.WriteLine(OldDirectory + " does not exist in relative path"); } } while (!Directory.Exists(".\\" + NewDirectory)) { Console.Write("New directory:"); NewDirectory = Console.ReadLine(); if (!Directory.Exists(".\\" + NewDirectory)) { Console.WriteLine(NewDirectory + " does not exist in relative path"); } } } else { OldDirectory = args[0]; NewDirectory = args[1]; } WriteToLog("Old Directory: " + OldDirectory + " subdirectory exists", LogFileDate + "-DirectoryDiff.log"); WriteToLog("New Directory: " + NewDirectory + " subdirectory exists", LogFileDate + "-DirectoryDiff.log"); //I inverted the dir below System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(OldDirectory); System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(NewDirectory); // Take a snapshot of the file system. IEnumerable <System.IO.FileInfo> list1 = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories); IEnumerable <System.IO.FileInfo> list2 = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories); //A custom file comparer defined below FileCompare myFileCompare = new FileCompare(); // This query determines whether the two folders contain identical file lists, based on the custom file comparer // that is defined in the FileCompare class. The query executes immediately because it returns a bool. bool areIdentical = list1.SequenceEqual(list2, myFileCompare); if (areIdentical == true) { Console.WriteLine("The two folders have the same directory list"); WriteToLog("The two folders have the same directory list", LogFileDate + "-DirectoryDiff.log"); } else { Console.WriteLine("The two folders DO NOT have the same directory list"); WriteToLog("The two folders DO NOT have the same directory list", LogFileDate + "-DirectoryDiff.log"); } // Find the common files. It produces a sequence and doesn't execute until the foreach statement. var queryCommonFiles = list1.Intersect(list2, myFileCompare); if (queryCommonFiles.Count() > 0) { Console.WriteLine("The following files are in both folders:"); foreach (var v in queryCommonFiles) { Console.WriteLine(v.FullName); //shows which items end up in result list } } else { Console.WriteLine("There are no common files in the two folders."); WriteToLog("No differences between the directories were found", LogFileDate + "-DirectoryDiff.log"); } //Creates DELTA subdirectory if needed to copy original file string deltadir = string.Concat(".\\", NewDirectory, "-DELTA\\"); if (!Directory.Exists(deltadir)) { Directory.CreateDirectory(deltadir); //New folder does not have same metadata as original. Line below was (failed) attempt at copying permissions //Directory.SetAccessControl(deltadir, Directory.GetAccessControl(".\\" + NewDirectory)); } // Identify NewDirectory/files in NewDirectory that's different from path OldDirectory/files var queryList1Only = (from file in list1 select file).Except(list2, myFileCompare); Console.WriteLine("The following files are in NewDirectory but not OldDirectory:"); WriteToLog("These files are different and were copied to the DELTA folder:", LogFileDate + "-DirectoryDiff.log"); //When NewDirectory/file is different, copy file to NewDirectory-DELTA foreach (var v in queryList1Only) { Console.WriteLine(v.FullName); WriteToLog(v.FullName, LogFileDate + "-DirectoryDiff.log"); string newdelta = ReplaceFirst(v.DirectoryName, NewDirectory, NewDirectory + "-DELTA"); if (!Directory.Exists(newdelta)) { Directory.CreateDirectory(newdelta); //New folder does not have same metadata as original. Line below was (failed) attempt at copying permissions //Directory.SetAccessControl(newdelta, Directory.GetAccessControl(".\\" + v.Directory)); } v.CopyTo(newdelta + "\\" + v); } // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); }
static void Main(string[] args) { while (true) { string SourcePath = @"C:\Source"; string TargetPath = @"C:\Target"; DirectoryInfo dirSource = new DirectoryInfo(SourcePath); DirectoryInfo dirTarget = new DirectoryInfo(TargetPath); //take a snapshot of the file system IEnumerable <FileInfo> ListSource = dirSource.GetFiles("*.*", SearchOption.AllDirectories); IEnumerable <FileInfo> ListTarget = dirTarget.GetFiles("*.*", SearchOption.AllDirectories); FileCompare MyFileCompare = new FileCompare(); //全比對判斷 bool areIdential = ListSource.SequenceEqual(ListTarget, MyFileCompare); //相同檔案 IEnumerable <FileInfo> QueryCommonFiles; //不同檔案 IEnumerable <FileInfo> QueryDiffFiles; //如果檔名都相同,進一步比對檔案內容 if (areIdential == true) { //找出相同檔案,檢查內文 QueryCommonFiles = ListSource.Intersect(ListTarget, MyFileCompare); if (QueryCommonFiles.Count() > 0) { foreach (var ItemSource in QueryCommonFiles) { //用來源名稱取得目標名稱 var ItemTarget = ListTarget.Select(x => x).Where(y => y.Name == ItemSource.Name).FirstOrDefault(); //察看檔案是否相同 bool IFSameFile = MyFileCompare.CheckInfo(ItemSource, ItemTarget); if (IFSameFile) { Console.WriteLine("檔案相同"); } else { Console.WriteLine("檔案不同"); File.Delete(ItemTarget.FullName); File.Copy(ItemSource.FullName, ItemTarget.FullName); } } } } else { //抓出與來源檔案不同的檔案並刪除 //相同檔案 QueryCommonFiles = ListSource.Intersect(ListTarget, MyFileCompare); QueryDiffFiles = ListTarget.Except(QueryCommonFiles); foreach (var item in QueryDiffFiles) { Console.WriteLine(item.FullName); } Console.WriteLine("檔案不同"); } //抓出同樣檔案 QueryCommonFiles = ListSource.Intersect(ListTarget, MyFileCompare); if (QueryCommonFiles.Count() > 0) { //Console.WriteLine("The following Files are on both folders"); foreach (var v in QueryCommonFiles) { //Console.WriteLine(v.FullName); } } else { //Console.WriteLine("There is no common files in the two folder"); } //找出source有,但是Target沒有的檔案 var QueryListSourceOnly = (from file in ListSource select file).Except(ListTarget, MyFileCompare); if (QueryListSourceOnly.Count() > 0) { Console.WriteLine("The following files are in ListSource but not in ListTarget"); } foreach (var F in QueryListSourceOnly) { Console.WriteLine(Path.GetDirectoryName(F.FullName)); string[] Folders = Path.GetDirectoryName(F.FullName).Split('\\'); //[0]->D: [1]->根目錄 [2]以上->資料深度 string NewFolderpath = TargetPath; for (int i = 2; i < Folders.Count(); i++) { NewFolderpath = NewFolderpath + "\\" + Folders[i]; if (!Directory.Exists(NewFolderpath)) { Directory.CreateDirectory(NewFolderpath); } } NewFolderpath = NewFolderpath + "\\"; string FileName = Path.GetFileName(F.FullName); Synchronization(F.FullName, NewFolderpath + FileName); } //Console.WriteLine("press any key to Exit"); //Console.ReadKey(); Thread.Sleep(3000); } }