using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

 

namespace QueryCompareTwoDirs

{

    class CompareDirs

    {

 

        static void Main(string[] args)

        {

 

            // Create two identical or different temporary folders 

            // on a local drive and change these file paths.

            // string pathA = @"\\ubuntu\var\www";

            // string pathB = @"\\WIN7X64ULT\j$\www";

            string pathA = @"W:";

            string pathB = @"J:\www";

            int LengthPathA = pathA.Length;

            int LengthPathB = pathB.Length;

 

            Console.WriteLine("Pause 10 seconds");

            System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(10).TotalMilliseconds);

            Console.WriteLine("10 s Done pausing");

 

 

           

            System.IO.DirectoryInfo dirfile1 = new System.IO.DirectoryInfo(pathA);

            IEnumerable<System.IO.DirectoryInfo> dirlist1 = dirfile1.GetDirectories("*.*", System.IO.SearchOption.AllDirectories).Where(d => !d.FullName.Contains("Albums") && !d.FullName.Contains("Vacation Pictures"));

            Console.WriteLine("Step 1 Dir path A");

 

            using (System.IO.StreamWriter adir2 = new System.IO.StreamWriter(@"E:\compare\adir1.txt"))

                foreach (var a in dirlist1)

                {

                    string ad2 = a.Name;

                    adir2.WriteLine(ad2);

                }

            Console.WriteLine("adir1.txt created from dirlist1");

           

            Console.WriteLine("Pause 10 seconds");

            System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(10).TotalMilliseconds);

            Console.WriteLine("Done pausing");

 

            // These lines find all the files

            // Take a snapshot of the file system.

            System.IO.DirectoryInfo file1 = new System.IO.DirectoryInfo(pathA);

            IEnumerable<System.IO.FileInfo> list1 = file1.GetFiles("*.*", System.IO.SearchOption.AllDirectories).Where(d => !d.FullName.Contains("Albums") && !d.FullName.Contains("Vacation Pictures"));

            Console.WriteLine("Step 2 files path A");

 

            using (System.IO.StreamWriter afile1 = new System.IO.StreamWriter(@"E:\compare\afile1.txt"))

                foreach (var a in list1)

                {

                    afile1.WriteLine(a.FullName.Substring(LengthPathA).ToString());

                }

            Console.WriteLine("afile1.txt created from list1");

 

 

           Console.WriteLine("Pause 10 seconds");

           System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(10).TotalMilliseconds);

           Console.WriteLine("Done pausing");

 

            System.IO.DirectoryInfo file2 = new System.IO.DirectoryInfo(pathB);

            IEnumerable<System.IO.FileInfo> list2 = file2.GetFiles("*.*", System.IO.SearchOption.AllDirectories).Where(d => !d.FullName.Contains("Albums") && !d.FullName.Contains("Vacation Pictures"));

            Console.WriteLine("Step 3 files path B");

 

            using (System.IO.StreamWriter bfile2 = new System.IO.StreamWriter(@"E:\compare\bfile2.txt"))

                foreach (var a in list2)

                {

                    bfile2.WriteLine(a.FullName.Substring(LengthPathB).ToString());

                }

            Console.WriteLine("bfile2.txt created from list2");

 

           Console.WriteLine("Pause 10 seconds");

           System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(10).TotalMilliseconds);

           Console.WriteLine("Done pausing");

 

            System.IO.DirectoryInfo dirfile2 = new System.IO.DirectoryInfo(pathB);

            IEnumerable<System.IO.DirectoryInfo> dirlist2 = dirfile2.GetDirectories("*.*", System.IO.SearchOption.AllDirectories).Where(d => !d.FullName.Contains("Albums") && !d.FullName.Contains("Vacation Pictures"));

            Console.WriteLine("Step 4 Dir path B");

 

            using (System.IO.StreamWriter bdir2 = new System.IO.StreamWriter(@"E:\compare\bdir2.txt"))

                foreach (var a in dirlist2)

                {

                    string bd2 = a.Name;

                    bdir2.WriteLine(bd2);

                }

            Console.WriteLine("bdir2.txt created from dirlist2");

 

 

           

 

 

            // These lines find all the directories

 

 

            // Take a snapshot of the directory system.

 

 

            /*

 * A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll

 

          Additional information: The specified network name is no longer available.

 

    If there is a handler for this exception, the program may be safely continued.

 *

 */

 

            using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"E:\compare\dirlist1.txt"))

                foreach (var x in list1)

                {

                    file.WriteLine(x.ToString());

                }

 

            using (System.IO.StreamWriter filelist1 = new System.IO.StreamWriter(@"E:\compare\filelist1.txt"))

                foreach (var x in list1)

                {

                    filelist1.WriteLine(x.ToString());

                }

 

 

            //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 are the same");

            }

            else

            {

                Console.WriteLine("The two folders are not the same");

            }

 

            // 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.");

            }

 

            // Find the set difference between the two folders.

            // For this example we only check one way.

 

 

            var queryDirListOnly = (from dirfile in dirlist1 select dirfile);

            using (System.IO.StreamWriter filedirlist1 = new System.IO.StreamWriter(@"E:\compare\queryDirlist1.txt"))

                foreach (var v in queryDirListOnly)

                                    {

                    var FinalDirCut = pathB + v.FullName.Substring(LengthPathA);

                    filedirlist1.WriteLine(FinalDirCut);

 

                    try

                    {

 

                        System.IO.Directory.CreateDirectory(FinalDirCut);

                        //Console.Write(FinalDirCut);

                        //Console.WriteLine(" Directory Created");

                        // Console.WriteLine("");

                    }

                    catch (IOException)

                    { }

 

                }

 

            //Results.txt is the difference between the two lists

            String directory = @"E:\Compare";

            String[] linesA = File.ReadAllLines(Path.Combine(directory, "afile1.txt"));

            String[] linesB = File.ReadAllLines(Path.Combine(directory, "bFile2.txt"));

 

            IEnumerable<String> onlyB = linesB.Except(linesA);

 

            File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB);

 

 

            string path = @"E:\compare\result.txt";

            string[] readText = File.ReadAllLines(path);

 

            foreach (var s in readText.Skip(13))

                using (System.IO.StreamWriter Results = new System.IO.StreamWriter(@"E:\compare\Result.csv", true))

               

            {

                string sourcefile = pathA + s;

                string destfile = pathB + s;

                Console.Write("SourceFile is ");

                System.Console.WriteLine(sourcefile);

                Console.Write("destFile is ");

               

                Console.WriteLine(destfile);

                Console.WriteLine("");

                Results.WriteLine("{0},{1}", sourcefile, destfile);

               

               

              

                try

                {

                    File.Copy(sourcefile, destfile, true);

                }

                catch (IOException copyError)

                {

                    Console.WriteLine(copyError.Message);

                }

               

 

                Console.Write(sourcefile);

                Console.WriteLine(" Copied to ");

                Console.WriteLine(destfile);

                

            }

 

 

 

 

 

 

         

            var queryList1Only = (from file in list1

                                  select file).Except(list2, myFileCompare);

 

            Console.WriteLine("The following files are in list1 but not list2:");

           

            using (System.IO.StreamWriter filelist1 = new System.IO.StreamWriter(@"E:\compare\filelist1.txt"))

           

                foreach (var x in queryList1Only)

                {

                    Console.WriteLine(x.FullName);

                    filelist1.WriteLine(x.FullName.ToString());

                }

       

 

          

            using (System.IO.StreamWriter FinalWrite = new System.IO.StreamWriter(@"E:\compare\FinalWrite.csv", true))

             {

                 foreach (var v in queryList1Only)

            {

                Console.WriteLine(v.FullName);

                String SourceSub = v.DirectoryName.Substring(LengthPathA);

                Console.WriteLine(SourceSub);

                Console.WriteLine(v.Directory);

                Console.WriteLine(v.Name);

                String Source = v.FullName;

 

                String Dest = pathB + SourceSub + "\\" + v.Name;

                Console.WriteLine(Source);

                Console.WriteLine(Dest);

                Console.WriteLine("");

 

                String DirToCreate = v.DirectoryName;

                Console.Write(DirToCreate);

                Console.WriteLine(" Does Not Exist in pathB");

                Console.WriteLine("");

 

                FinalWrite.WriteLine("{0},{1}", Source, Dest);

               

               

                try

                {

                    File.Copy(Source, Dest, true);

                }

                catch (IOException copyError)

                {

                    Console.WriteLine(copyError.Message);

                }

 

               

                Console.Write(Source);

                Console.WriteLine(" Copied to ");

                Console.WriteLine(Dest);

               

                }

             }

 

             System.IO.DirectoryInfo newfile2 = new System.IO.DirectoryInfo(pathB);

             IEnumerable<System.IO.FileInfo> newlist2 = newfile2.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

 

             var newqueryList1Only = (from file in list1

                                   select file).Except(newlist2, myFileCompare);

 

            Console.WriteLine("");

            Console.WriteLine("Compare after copying complete");

            Console.WriteLine("The following files are in list1 but not list2:");

 

             using (System.IO.StreamWriter newfilelist1 = new System.IO.StreamWriter(@"E:\compare\newfilelist1.txt"))

                 foreach (var x in newqueryList1Only)

                 {

                     newfilelist1.WriteLine(x.FullName.ToString());

                 }

 

            // Keep the console window open in debug mode.

            Console.WriteLine("Press any key to exit.");

           

           

 

        }

  

 

    // This implementation defines a very simple comparison

    // between two FileInfo objects. It only compares the name

    // of the files being compared and their length in bytes.

    class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>

    {

        public FileCompare() { }

 

        public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)

        {

            return (f1.Name == f2.Name &&

                    f1.Length == f2.Length);

        }

 

        // Return a hash that reflects the comparison criteria. According to the 

        // rules for IEqualityComparer<T>, if Equals is true, then the hash codes must

        // also be equal. Because equality as defined here is a simple value equality, not

        // reference identity, it is possible that two or more objects will produce the same

        // hash code.

        public int GetHashCode(System.IO.FileInfo fi)

        {

            string s = String.Format("{0}{1}", fi.Name, fi.Length);

            return s.GetHashCode();

        }

    }

}

 

}