C#FileInfo - 查找重复的文件

时间:2012-01-25 10:57:38

标签: c# file fileinfo

我有一个FileInfo数组,包含~200.000个文件条目。我需要找到所有具有相同文件名的文件。我需要每个重复文件的目录名和文件名,因为我想在之后重命名它们。

我已经尝试过了:

  • 将每个条目与整个列表进行比较2对于“循环”//错误的想法,这将需要数小时甚至数天^^
  • 尝试使用Linq排序//因为在我有困难写出正确的声明之前我没有使用过Linq,也许有人可以帮助我:)。

2 个答案:

答案 0 :(得分:8)

听起来应该这样做:

var duplicateNames = files.GroupBy(file => file.Name)
                          .Where(group => group.Count() > 1)
                          .Select(group => group.Key);

现在是学习LINQ的非常的好时机。它非常有用 - 学习它的时间(即使只是对象的LINQ)也会很快收回成本。

编辑:好的,如果您想要每个组的原始FileInfo,只需删除选择:

var duplicateGroups = files.GroupBy(file => file.Name)
                           .Where(group => group.Count() > 1);

// Replace with what you want to do
foreach (var group in duplicateGroups)
{
     Console.WriteLine("Files with name {0}", group.Key);
     foreach (var file in group)
     {
         Console.WriteLine("  {0}", file.FullName);
     }
}

答案 1 :(得分:2)

这应该有效:

HashSet<string> fileNamesSet = new HashSet<string>();
List<string> duplicates = new List<string>();

foreach(string fileName in fileNames)
{
    if(fileNamesSet.Contains(fileName))
    {
        duplicates.Add(fileName);
    }
    else
    {
        fileNamesSet.Add(fileName);
    }
}

然后,重复项将包含所有重复文件名的列表。

请注意,由于Windows文件名不区分大小写,因此您可能希望通过使用.ToUpperInvariant()

将所有文件名首先转换为大写来考虑这一点。