如何比较列表中的所有文件以查找重复项

时间:2015-03-17 10:42:28

标签: c# file compare

我需要一种方法来比较目录中的文件。 首先,我选择一个rootfolder来获取其中的所有文件。

IEnumerable<FileInfo> fileList = rootDir.GetFiles("*.*", SearchOption.AllDirectories);

我的第一次尝试是使用两个foreach循环

        foreach (FileInfo file1 in fileList)
        {
            foreach (FileInfo file2 in fileList)
            {
                if (file2.FullName != file1.FullName && file2.Length == file1.Length)
                {
                    tb_result.AppendText("\r\n" + file1.FullName + "\r\n" + file2.FullName + "\r\n");
                }
            }

现在我必须使用另一个列表来保存已使用的文件名,以防止我的应用程序找到相同的已使用文件。

示例:

  • ROOTDIR
    • TEST1
    • TEST2
    • TEST3
  • 子目录
    • TEST1

该方法在rootdir中找到test1,在subdir中找到test1。稍后它会在subdir中找到test1,在rootdir中找到test1并将其打印出来。

有没有办法从列表中删除已使用的元素,还是有更好的方法将目录与子目录进行比较?

感谢

2 个答案:

答案 0 :(得分:1)

目前还不清楚你在寻找什么,但你可能会:

// We group by size, and we take only the groups that have multiple files
var grouped = fileList.GroupBy(x => x.Length).Where(x => x.Count() > 1);

// Each group is "keyed"/"grouped" by size
foreach (var group in grouped)
{
    Console.WriteLine("Size: {0}", group.Key);

    foreach (var file in group)
    {
        Console.WriteLine(" {0}", file.FullName);
    }
}

请注意,虽然您的方法是O(n^2)(每个文件相互比较),甚至Guillaume的一个是O(n^2)(但更短,因为他做 n *(n-1) )/ 2 比较或类似的东西),这个应该是O(n)(因为如果GroupBy内部使用哈希表,O(n)应该是{{1}})

答案 1 :(得分:0)

更改双循环以避免多次检查相同的项目。

    FileInfo[] fileList = rootDir.GetFiles("*.*", SearchOption.AllDirectories).ToArray();
    for (int i = 0; i < fileList.Length - 1; i++)
    {
        FileInfo file1 = fileList[i];
        for (j = i + 1; j < fileList.Length; j++)
        {
            FileInfo file2 = fileList[j];
            if (file2.Length == file1.Length)
            {
                tb_result.AppendText("\r\n" + file1.FullName + "\r\n" + file2.FullName + "\r\n");
            }
        }