C# 比较两个文件夹中不相同的文件?

C# 比较两个文件夹中不相同的文件?,c#,linq,C#,Linq,在这里,我比较了两个文件的基础上的名称和写入一个文本文件。。。 但我需要把名字和目录名一起写…但我不能像这样选择目录名 var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length }); var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories).Select(x =&

在这里,我比较了两个文件的基础上的名称和写入一个文本文件。。。 但我需要把名字和目录名一起写…但我不能像这样选择目录名

     var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length });
    var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length });
    var onlyIn1 = dir1Files.Except(dir2Files).Select(x => new { x.Name });
    File.WriteAllLines(@"d:\log1.txt", foo1);

有什么建议吗?

使用
全名解决您的问题吗

 var onlyIn1 = dir1Files.Except(dir2Files).Select(x => new { x.Name,x.DirectoryName });
或者,您可以在
Select
语句中组合一个自定义字符串:

var onlyIn1 = dir1Files.Except(dir2Files).Select(x => new { x.FullName }); 
为了能够在对象中使用此信息,不要在第一步中创建信息有限的匿名类型,而是保留完整的
FileInfo
对象:

// get strings in the format "file.ext, c:\path\to\file"
var onlyIn1 = dir1Files.Except(dir2Files).Select(x => 
                  string.Format("{0}, {1}", x.Name, x.Directory.FullName)); 
更新
代码示例中真正的问题是,
Except
将使用默认的相等比较器进行比较。对于大多数类型(当然是匿名类型),这意味着它将比较对象引用。由于您有两个包含
FileInfo
对象的列表,
Except
将返回第一个列表中的所有对象,其中第二个列表中找不到相同的对象实例。由于第一个列表中的对象实例都不存在于第二个列表中,因此将返回第一个列表中的所有对象

为了解决此问题(并且仍然可以访问要存储的数据),您需要使用。首先,让我们创建
IEqualityComparer

var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories);
var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories);

@Fredrik Mörk:我不能这样给出..我只是根据名称和长度来比较文件..但我必须同时写名称和目录名..如果我把x和点放在一起,意味着它只显示名称和长度,而不是选择新的{x.name,x.length}只要选择(x=>x)然后您就可以使用整个对象进行筛选了。@bala3569:我没有注意到您在前两个步骤中创建了匿名类型。正如@Tom指出的,只需返回
x
(这实际上意味着您可以跳过对
Select
的调用)。我会更新我的答案以反映这一点。@Fredrik Mörk:但它会比较所有东西……我必须只比较名字。。。但必须同时写入名称和目录name@Tom:但它将比较所有内容…..我必须单独比较名称,但必须同时写入名称和目录名称所有目录名称都将相同,为什么需要将它们保留在LINQ查询结果中?就从dir1开始吧。
class FileInfoComparer : IEqualityComparer<FileInfo>
{
    public bool Equals(FileInfo x, FileInfo y)
    {
        // if x and y are the same instance, or both are null, they are equal
        if (object.ReferenceEquals(x,y))
        {
            return true;
        }
        // if one is null, they are not equal
        if (x==null || y == null)
        {
            return false;
        }
        // compare Length and Name
        return x.Length == y.Length && 
            x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase);
    }

    public int GetHashCode(FileInfo obj)
    {
        return obj.Name.GetHashCode() ^ obj.Length.GetHashCode();
    }
}
var dir1 = new DirectoryInfo(@"c:\temp\a");
var dir2 = new DirectoryInfo(@"c:\temp\b");

var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories); 
var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories); 

var onlyIn1 = dir1Files
    .Except(dir2Files, new FileInfoComparer())
    .Select(x =>  string.Format("{0}, {1}", x.Name, x.Directory.FullName));