0

我想根据自定义差异比较获得两个目录的差异。我环顾四周,发现我根据我的要求修改了这段代码,但不知何故它返回了不正确的结果。

我想要两个 FileNamecomparions,一个按名称,一个按大小

class FileNameCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileNameCompare() { }

    public bool Equals(System.IO.FileInfo file1, System.IO.FileInfo file2)
    {
        return (file1.Name == file2.Name);
    }

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

在我的代码中,我正在调用

    //Compare files
        FileNameCompare fileNameCompare = new FileNameCompare();


        bool areIdentical = baseList.SequenceEqual(compareList, fileNameCompare);

        IEnumerable<FileInfo> diff = (from file in baseList
                                                      select file).Except(compareList, fileNameCompare);

IEnumerable baseList 类型的 baselist 和 comparelist

现在,当我有两个具有相同文件名但大小不同的目录时,areidentical 为真,但差异仍然在 baselist 中有一个文件。

我做错了什么?

在同一个目录上,我需要运行名称和大小比较,我需要确切地知道哪些文件的名称和大小不同,这就是我分离比较的原因。

编辑:

我需要找到大小不同的文件(两个目录中都存在),所以根据 Ramoku 的提示,这就是我所做的。

        //Get common directories between baselist and comparelist
        IEnumerable<FileInfo> commonList = (from file in baseList
                                            select file).Intersect(compareList, fileNameCompare);

        IEnumerable<FileInfo> diffInListBySize = (from file in commonList
                                                  select file).Except(compareList, fileSizeCompare);
4

4 回答 4

1

这是你的意思还是我错过了什么?

class FileNameCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileNameCompare() { }

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

    public int GetHashCode(System.IO.FileInfo fileInfo)
    {
        string fileString = String.Format("{0}{1}", fileInfo.Name, fileInfo.Length);
        return fileString.GetHashCode();
    }
}
于 2013-09-12T18:03:29.943 回答
0

您可以使用该FullName属性,它将给出文件的完整路径:

class FileNameCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileNameCompare() { }

    public bool Equals(System.IO.FileInfo file1, System.IO.FileInfo file2)
    {
        return file1.FullName == file2.FullName;
    }

    public int GetHashCode(System.IO.FileInfo fileInfo)
    {
        string fileString = String.Format("{0}{1}", fileInfo.Name, fileInfo.Length);
        return fileString.GetHashCode();
    }
}
于 2013-09-12T17:57:57.330 回答
0

GetHashCode正在使用文件的大小来确定相等性。

改变:

public int GetHashCode(System.IO.FileInfo fileInfo)
{
    return fileInfo.Name.GetHashCode();
}
于 2013-09-12T17:57:58.703 回答
0

我没有看到您实际比较文件大小的位置。尝试使用FileInfo.Length来获取文件的大小。有关其他信息,请参阅 MSDN:

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.length.aspx

于 2013-09-12T17:59:17.067 回答