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\www";
string pathB = @"\\WIN7X64ULT\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("Done pausing");
System.IO.DirectoryInfo dirfile1 = new System.IO.DirectoryInfo(pathA);
IEnumerable<System.IO.DirectoryInfo> dirlist1 = dirfile1.GetDirectories("*.*", System.IO.SearchOption.AllDirectories);
Console.WriteLine("Step 4 Dir path A");
Console.WriteLine("Pause 5 seconds");
System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(5).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);
Console.WriteLine("Step 1 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.ToString());
}
Console.WriteLine("Pause 5 seconds");
System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(5).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);
Console.WriteLine("Step 2 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.ToString());
}
Console.WriteLine("Pause 5 seconds");
System.Threading.Thread.Sleep((int)System.TimeSpan.FromSeconds(5).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);
Console.WriteLine("Step 3 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);
}
using (System.IO.StreamWriter adir2 = new System.IO.StreamWriter(@"E:\compare\adir2.txt"))
foreach (var a in dirlist1)
{
string ad2 = a.Name;
adir2.WriteLine(ad2);
}
// 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");
}
catch (IOException)
{ }
}
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.");
Console.ReadKey();
}
}
// 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();
}
}
}