我想比較兩個目錄來看到的是目錄1什麼文件不在目錄2.我有以下代碼:麻煩比較兩個目錄
System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(pathA);
System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(pathB);
IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.PRN");
IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.PRN");
IEnumerable<System.IO.FileInfo> list3 = list1.Except(list2);
Console.WriteLine("The following files are in list1 but not list2:");
foreach (var v in list3)
{
Console.WriteLine(v);
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
當這個運行時,它清楚地列出了所有在目錄1中的文件,但其中許多已經在目錄2中。我可以通過查看Windows資源管理器並查看文件名來查看此文件。我錯過了什麼?
編輯:
我相信問題出在文件比較部分。我試圖讓它忽略文件擴展名的情況。我試過這個:
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.ToUpper == f2.Name.ToUpper &&
// f1.Length == f2.Length);
return (string.Equals(f1.Name, f2.Name, StringComparison.OrdinalIgnoreCase) && f1.Length == f2.Length);
}
public int GetHashCode(System.IO.FileInfo fi)
{
string s = String.Format("{0}{1}", fi.Name, fi.Length);
return s.GetHashCode();
}
}
但是,這仍然不起作用。你可以看到我評論了另一個嘗試,只是在比較中把所有的東西都做成大寫,但它不會那麼做。
FileInfo還包含日期和時間信息。你不應該只是比較文件名嗎? – rene 2013-05-08 19:52:19
您確定文件名中沒有小的差異嗎? – tnw 2013-05-08 19:52:37
我不認爲'System.IO.FileInfo'的'Equals()'方法是你想要的。你爲什麼不定義文件「已經[在]目錄2中」的含義?你的意思是同一個文件名嗎?完全相同的字節? – rliu 2013-05-08 19:53:38