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