Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
            }
        }