Проверка дубликатов ввода-вывода файла более эффективна? - PullRequest
1 голос
/ 17 декабря 2010

В основном у меня есть это приложение, которое просматривает все mp3-файлы в папке и возвращает список файлов без дубликатов. У меня есть два способа выполнить эту задачу. Первый удаляет дубликаты имен файлов, а второй удаляет дубликаты файлов с соответствующими тегами mp3 IDv3.

Однако моя папка содержит около 5000 файлов, которые успешно удаляют дубликаты до 4900, но это занимает вечность! Кто-нибудь может предложить более эффективный метод? Я использовал параллелизм, чтобы сделать вещи максимально быстрыми, но все равно он медленный.

Первый способ удаления повторяющихся имен файлов:

private static IEnumerable<string> GetFilesFromDir(string dir)
        {
            return Directory.GetFiles(dir, "*.mp3", SearchOption.AllDirectories).Distinct();
        }

Второй метод просматривает каждый файл, возвращенный из вышеуказанного метода, и проверяет его информацию тега IDv3 (Исполнитель - Название песни), чтобы убедиться, что дублированные песни отсутствуют.

private static IEnumerable<string> RemoveDuplicates(IEnumerable<string> files)
{
    var dictionary = new ConcurrentDictionary<string, string>();

    Parallel.ForEach(files, f =>
                                {
                                    string tag = SongInformation.ArtistTitleAlbumString(f);
                                    dictionary.TryAdd(tag, f);
                                });

    return dictionary.Values;
}

Два метода вызываются следующим образом:

var newFiles = RemoveDuplicates(GetFilesFromDir(Settings.SharedFolder));

1 Ответ

0 голосов
/ 17 декабря 2010

вызов Distinct() здесь кажется бессмысленным. Directory.GetFiles() возвращает полные имена файлов (с путем), поэтому они всегда различаются.

...