using System.IO; |
using System.Collections.Generic; |
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 = @"C:\TestDir" ; |
string pathB = @"C:\TestDir2" ; |
DirectoryInfo dir1 = new DirectoryInfo ( pathA ); |
DirectoryInfo dir2 = new DirectoryInfo ( pathB ); |
// Take a snapshot of the file system. |
IEnumerable list1 = dir1.GetFiles ( "*.*" , SearchOption.AllDirectories ); |
IEnumerable list2 = dir2.GetFiles ( "*.*" , 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 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 queryList1Only = ( from file in list1 |
select file ).Except ( list2, myFileCompare ); |
Console.WriteLine ( "The following files are in list1 but not list2:" ); |
foreach ( var v in queryList1Only ) |
{ |
Console.WriteLine ( v.FullName ); |
} |
// 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 : IEqualityComparer |
{ |
public FileCompare() { } |
public bool Equals ( FileInfo f1, 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, 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 ( FileInfo fi ) |
{ |
string s = String.Format ( "{0}{1}" , fi.Name, fi.Length ); |
return s.GetHashCode(); |
} |
} |
} |
by: 发表于:2018-01-15 09:56:07 顶(0) | 踩(0) 回复
??
回复评论