【问题标题】:Return only duplicate files from specified directory仅返回指定目录中的重复文件
【发布时间】:2025-12-21 23:50:07
【问题描述】:

我正在尝试返回目录中所有重复文件的列表。我设法从目录和子目录中返回所有文件名。我想我有允许返回重复文件的代码,但我想返回所有重复文件的列表及其到控制台的路径。我创建了一个包含文件夹、文件名和文件大小的 FileDetail 类。 我需要为重复文件创建另一个类吗? 返回找到的所有重复文件列表的最佳方法是什么?

对 C# 相对较新,并使用此任务作为学习使用目录的方法的经验

private static void ListAllDuplicateFiles()
{

    string[] files = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
    List<string> duplicates = new List<string>();
    List<FileDetail> fileDetails = new List<FileDetail>();
    foreach (string file in files)
    {
        FileInfo fileInfo = new FileInfo(file);
        FileDetail fileDetail = new FileDetail(fileInfo);
        fileDetails.Add(fileDetail);

        if (fileDetails.Select(f => f.Filename).Contains(file))
        {
            duplicates.Add(file);
        }
    }

    foreach (string duplicate in duplicates)
    {
        List<FileDetail> duplicateFileDetails = fileDetails.Where(f => f.Filename == duplicate).ToList();
    }

    foreach (FileDetail fileDetail in fileDetails)
    {
        Console.WriteLine(fileDetail.Filename);
    }

    Console.ReadLine();
}

【问题讨论】:

  • 这能回答你的问题吗? Find duplicate files in a directory using LINQ
  • 很遗憾,它并没有真正回答这个问题,因为我可以在这里收集重复项,但不知道如何给他们自己的课程并将它们作为列表返回给控制台

标签: c# file directory duplicates


【解决方案1】:

我认为你很接近。但也许您可以更轻松地实现目标。 所以你问了两个问题。

第一个问题:我需要为重复文件创建一个新类吗?平心而论,似乎即使是第一个类也有点多余,因为您正在使用的类:System.IO.FileInfo 具有您感兴趣的所有属性(或者似乎无论如何)。所以,不,我不认为你这样做。您可以更多地以结构化数据和可能确定行为的方式来考虑类。如果您不需要特定的行为,也不需要将数据添加到已经存在的可用类,不妨使用它。 :-)

第二个问题:返回找到的所有重复文件列表的最佳方法是什么?我想最简单的方法来做你正在做的事情,但我会将“重复”的数据类型从 List&lt;string&gt; 更改为 List&lt;FileInfo&gt; 并在找到它们时将它们放在那里。

string[] files = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
var fileInfos = new List<FileInfo>();
foreach(var item in files)
{
    var fileInfo = new FileInfo(item);
    var doppelganger = fileInfos.FirstOrDefault(x => x.Name == fileInfo.Name);
    if (doppelganger != null && duplicates.All(x => x.FullName != doppelganger.FullName))                
        duplicates.Add(doppelganger);
            
    if(doppelganger != null)
        duplicates.Add(fileInfo);
            
    fileInfos.Add(fileInfo);
} 

所以,我正在做的是重新使用 System.IO 中的 FileInfo 类,并在必要时将它们放入列表中。只是为了澄清'doppelganger',如果你想要所有双打,那将包括你正在比较的那个,对吧?这就是为什么我还要添加那个。也许这可以更优雅地完成,但是嘿,你去吧。

希望这会有所帮助!快乐编码

【讨论】:

    最近更新 更多