找出两个文件是否以编程方式不同的最简单方法是什么?

时间:2010-01-29 16:16:14

标签: .net

最简单以什么方式查找两个文本文件是否以编程方式不同?鉴于两个文件,我只需要知道它们是否不同。这是一个快速工具,可以帮助进行特别讨厌的合并(在一个分支中切换从VB到C#的语言(耶!),并在另一个分支中进行许多更改),它不会投入生产。

可能的解决方案:

  1. 散列两个文件并比较散列
  2. 拉入文件并进行字符串比较
  3. 调用外部差异工具(不幸的是,Winmerge没有这个CLI)
  4. 如果可能的话,忽略空白区域会很棒,但我并不在乎它。最重要的是它需要快速简便。

    顺便说一下,我正在使用.Net 3.5sp1。感谢您的任何想法或指示。

8 个答案:

答案 0 :(得分:11)

Microsoft知识库中有一篇文章,希望它有所帮助。他们比较字节以查看两个文件是否不同 - How to create a File-Compare function in Visual C#

答案 1 :(得分:10)

最快的方法是比较流上加载的文件的字节到字节。散列这两个文件对于大文件来说需要太长时间,字符串比较也需要外部工具。

比较字节到字节对你来说是最好的,因为它们只有在两者相同时才能达到文件的EOF。

如果你进行哈希比较,字符串比较或外部工具,你必须在比较时经历整个文件,比较逐字节只会在它们相同的情况下进行。

答案 2 :(得分:4)

逐字节检查,这里是一些代码:

public static bool AreFilesIdentical(string path1, string path2)
{
    using (FileStream file1 = new FileStream(path1)) {
        using (FileStream file2 = new FileStream(path2)) {

            if (file1.Length == file2.Length) {
                while (file1.Position < file1.Length) {
                    if (file1.ReadByte() != file2.ReadByte()) {
                        return false;
                     }
                }
                return true;
            }  
            return false;
        }
    }

}

答案 3 :(得分:3)

使用MD5哈希算法会比较结果吗?这是一个example

答案 4 :(得分:1)

这还取决于您要解决的问题。您是否尝试回答这个问题:在N个文件的目录中,找到所有完全重复的内容?或者这两个文件完全相同?

如果您只是比较两个文件,那么使用逐字节检查会更有效。

但是如果你试图找到N个文件中的所有重复对,那么MD5哈希更好,因为你可以创建并存储一次MD5哈希值,并将这个小得多的值与每对文件进行比较。另外,您将遍历目录中每个其他文件的每个文件字节流。

答案 5 :(得分:1)

我在一年前实现了一个非常专业的差异版本(我的文件超过6GB,不得不进行比较)。所以我知道diff的内部工作原理(当然是很多副本和粘贴)。一些想法:

  • 如果您想简单地了解它们是否不同,请逐字节比较它们。通过检查它们的大小(长度)是否不同来优化,然后一次读取一个字节的文件并检查它们是否不同。你不必关心缓冲,因为你的文件API应该为你做(.Net确实如此)。
  • 如果您有一些规则要应用于比较:
    • 如果您在读取字节时忽略空格或任何其他字符,请检查是否应忽略该字节。如果应该,请阅读下一个,但只是在该文件上。
    • 如果有规则将逐行,则逐行读取文件。然后散列该行,忽略您想要忽略的任何内容。
    • 请记住,该行可以定义为可变长度记录,换行符作为终止符(分隔符)。因此,您可以将行定义为您想要的任何内容,并准确读取,哈希并进行比较。

如果您愿意,我可以提供代码。差异文件更复杂,因为您还将输出不同的文件。

答案 6 :(得分:0)

从问题 - 最简单&amp;文本文件

StreamReader sr1 = new StreamReader(filePath1);
StreamReader sr2 = new StreamReader(filePath2);
if (sr1.ReadToEnd() == sr2.ReadToEnd() )
{ do stuff }

它不快或不漂亮,但很容易

答案 7 :(得分:0)

if ( $file1 != $file2 ) return true;

当然这在VB和C#之间有所不同