文件IO重复检查更有效?

时间:2010-12-17 14:14:54

标签: c# file io mp3 parallel-processing

基本上我有这个应用程序扫描文件夹中的所有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 :(得分:0)

Distinct()的电话似乎毫无意义。 Directory.GetFiles()返回完整的文件名(带路径),因此它们始终是不同的。