[c#]代码库
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) 回复
??
回复评论