首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个目录时出现问题

比较两个目录时出现问题
EN

Stack Overflow用户
提问于 2013-05-09 03:48:21
回答 4查看 1.7K关注 0票数 4

我正在尝试比较两个目录,看看目录1中有哪些文件不在目录2中。我有以下代码:

代码语言:javascript
复制
System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(pathA);
System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(pathB);

IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.PRN");
IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.PRN");

IEnumerable<System.IO.FileInfo> list3 = list1.Except(list2);

Console.WriteLine("The following files are in list1 but not list2:");

foreach (var v in list3)
{
    Console.WriteLine(v);
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();

当这个程序运行时,它会清楚地列出目录1中的所有文件,但其中许多文件已经在目录2中。我可以通过查看Windows资源管理器和查看文件名来看到这一点。我遗漏了什么?

编辑:

我认为问题出在文件比较部分。我试图让它忽略文件扩展名的大小写。我已经尝试过了:

代码语言:javascript
复制
    class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileCompare() { }

    public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
    {
        //return (f1.Name.ToUpper == f2.Name.ToUpper &&
        //        f1.Length == f2.Length);

        return (string.Equals(f1.Name, f2.Name, StringComparison.OrdinalIgnoreCase) && f1.Length == f2.Length);
    }

    public int GetHashCode(System.IO.FileInfo fi)
    {
        string s = String.Format("{0}{1}", fi.Name, fi.Length);
        return s.GetHashCode();
    }
}

但这仍然不起作用。您可以看到,我注释掉了另一个尝试,在比较中将所有内容都设为大写,但它不会这样做。

EN

回答 4

Stack Overflow用户

发布于 2013-05-09 03:53:09

您将需要使用Except()的重载版本,并向其传递一个自定义的IEqualityComparer实现,该实现准确地指出了定义两个FileInfo对象的精确匹配的标准。

请参阅此处的示例,并根据自己的需要进行修改:http://msdn.microsoft.com/en-us/library/bb336390.aspx

票数 7
EN

Stack Overflow用户

发布于 2013-05-09 03:55:35

MSDN上有一个例子向你展示了如何做到这一点。

创建您的IEqualityComparer实现

代码语言:javascript
复制
class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileCompare() { }

    public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
    {
        return (f1.Name == f2.Name &&
                f1.Length == f2.Length);
    }

    public int GetHashCode(System.IO.FileInfo fi)
    {
        string s = String.Format("{0}{1}", fi.Name, fi.Length);
        return s.GetHashCode();
    }
}

然后在比较器中使用Except重载。

代码语言:javascript
复制
var queryList1Only = (from file in list1
                      select file).Except(list2, myFileCompare);
票数 2
EN

Stack Overflow用户

发布于 2013-05-09 04:35:32

由于您只对名称感兴趣,因此使用LINQ的.Select扩展方法将您的序列投影到名称序列:

代码语言:javascript
复制
IEnumerable<string> list1 = dir1.GetFiles("*.PRN").Select(fi => fi.Name);
IEnumerable<string> list2 = dir2.GetFiles("*.PRN").Select(fi => fi.Name);
IEnumerable<string> list3 = list1.Except(list2);

(您可以使用var,隐式类型。)

这是因为string的默认相等比较器执行序号和大小写敏感的比较(而不是像FileInfo类附带的引用相等比较)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16449010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档