Возвращать только повторяющиеся файлы из указанного каталога - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь вернуть список всех повторяющихся файлов в каталоге. Мне удалось вернуть все имена файлов из каталога и подкаталогов. Я думаю, что у меня есть код, который позволяет возвращать файлы-дубликаты, но я хочу вернуть список всех повторяющихся файлов и их пути к консоли. Я создал класс 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();
}

1 Ответ

0 голосов
/ 04 августа 2020

Думаю, вы довольно близки. Но, может быть, вам удастся добиться чего-то немного проще. Итак, вы задаете два вопроса.

Первый вопрос: нужно ли мне создавать новый класс для повторяющихся файлов? Честно говоря, кажется, что даже первый класс немного избыточен, поскольку используемый вами класс: System.IO.FileInfo имеет все интересующие вас свойства (по крайней мере, так кажется). Так что нет, я так не думаю. Вы можете больше думать о классах как о способе структурирования ваших данных и возможного определяющего поведения. Если вам не нужно указывать c поведение или добавлять данные к уже существующему доступному классу, можно также использовать его. : -)

Второй вопрос: как лучше всего вернуть список всех найденных файлов-дубликатов? Думаю, это самый простой способ сделать то, что вы делаете, но я бы изменил тип данных «дубликатов» с List<string> на List<FileInfo> и вставил m туда, когда вы их найдете.

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);
} 

Итак, что я делаю, это повторно использую класс FileInfo в System.IO и помещаю их в список там, где это необходимо. Просто чтобы прояснить «двойника», если вы хотите, чтобы все двойники включали тот, с которым вы сравниваете, верно? Вот почему я также добавляю это. Может быть, это можно было бы сделать более элегантно, но, привет go.

Надеюсь, это поможет! Счастливое кодирование

...