删除不同目录中的重复文件

时间:2016-06-14 18:23:16

标签: c# .net

我正在使用Directory.EnumerateFiles列出两个单独目录中的文件。两个文件夹中都存在一些文件。如何从组合列表中删除任何重复文件?

try
{
    corporateFiles = Directory.EnumerateFiles(@"\\" + corporateServer, "*.pdf", SearchOption.AllDirectories).ToList();
}
catch
{
    corporateFiles = new List<string>();
}

try {
    functionalFiles = Directory.EnumerateFiles(@"\\" + functionalServer, "*.pdf", SearchOption.AllDirectories).ToList();
}
catch
{
    functionalFiles = new List<String>();
}
var combinedFiles = corporateFiles.Concat(functionalFiles);

2 个答案:

答案 0 :(得分:1)

使用Union代替Concat

var combinedFiles = corporateFiles.Union(functionalFiles);

您可以使用传递IEqualityComparer<string>的重载来仅使用名称部分进行比较:

var combined = corporateFiles.Union(functionalFiles, new FileNameComparer())

class FileNameComparer : EqualityComparer<string>
{
    public override bool Equals(string x, string y)
    {
        var name1 = Path.GetFileName(x);
        var name2 = Path.GetFileName(y);
        return name1 == name2;
    }

    public override int GetHashCode(string obj)
    {
        var name = Path.GetFileName(obj);
        return name.GetHashCode();
    }
}

答案 1 :(得分:1)

似乎我不能满足我对LINQ的渴望。

这是一个单行:

var combinedFiles = corporateFiles.Concat(functionalFiles.Where(x => !(corporateFiles.Select(y => y.Split('\\').Last()).ToList().Intersect(functionalFiles.Select(y => y.Split('\\').Last()))).Contains(x.Split('\\').Last())));

这使文件路径保持corporateFiles。如果您愿意,可以更换它们。

我会尝试将其格式化为更具可读性。

编辑:这里的代码抽象了一点,希望更具可读性:

// Get common file names:
var duplicateFileNames = corporateFiles.Select(y => y.Split('\\').Last()).ToList().Intersect(functionalFiles.Select(y => y.Split('\\').Last()));

// Remove entries in 'functionalFiles' that are duplicates:
var functionalFilesWithoutDuplicates = functionalFiles.Where(x => !duplicateFileNames.Contains(x.Split('\\').Last()));

// Combine the un-touched 'corporateFiles' with the filtered 'functionalFiles':
var combinedFiles = corporateFiles.Concat(functionalFilesWithoutDuplicates);