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);
}
}
}