using System; using System.IO; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //★したいこと //ディレクトリAとディレクトリBを比較し、ディレクトリAにのみに存在するファイル //および更新されたファイルの一覧を作成したい。 //ただし、各々の検索ディレクトリに対して相対的に同階層で同名、同サイズなら同一ファイルとみなす。 //★前提条件 //c:\test\dira\doc1.txt(3byte) //c:\test\dira\doc2.txt(3byte) //c:\test\dira\doc3.txt(3byte) //c:\test\dirb\doc1.txt(3byte) //c:\test\dirb\doc2.txt(3byte) //c:\test\dirb\sub\doc3.txt(3byte) //★期待する結果 //c:\test\dira\doc3.txt string basePath1 = @"c:\test\dirA"; string basePath2 = @"c:\test\dirB"; DirectoryInfo d1 = new DirectoryInfo(basePath1); DirectoryInfo d2 = new DirectoryInfo(basePath2); var files1 = from file1 in d1.EnumerateFiles("*", SearchOption.AllDirectories) select new KurabetaiFile(d1, file1); var files2 = from file2 in d2.EnumerateFiles("*", SearchOption.AllDirectories) select new KurabetaiFile(d2, file2); var queryList1Only = files1.Except(files2); foreach (var file in queryList1Only) { Console.WriteLine(String.Format("DirAにのみ存在:{0}", file.FullName)); } } } public class KurabetaiFile { private FileInfo f; private int hc; public string FullName { get { return f.FullName; } } public KurabetaiFile(DirectoryInfo dir, FileInfo file) { f = file; hc = file.FullName.Substring(dir.FullName.Length).GetHashCode(); } public override int GetHashCode() { return hc; } public override bool Equals(object obj) { var _obj = obj as KurabetaiFile; return (_obj == null) ? false : (f.Length == _obj.f.Length); } } }