我想比较两个目录来看到的是目录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