2010-01-29 65 views
7

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

可能的解决方案:

  1. 哈希文件和比较哈希
  2. 拉中的文件,只是做一个字符串比较
  3. 调出给外部diff工具(不幸的WinMerge没有这是一个CLI)

如果可能忽略空白将是真棒,但我不关心它太多。主要的是它需要快速简单。

顺便说一句,我正在使用.net 3.5sp1。感谢任何想法或指针。

+0

http://unxutils.sourceforge.net/拥有gnu diff for windows。 'diff -q file1 file2'是你想要的语法 – KitsuneYMG 2010-01-29 16:34:43

+0

FWIW,三种差异工具将帮助显示两个VB文件之间的差异,同时将它们与新的C#文件进行比较。 Beyond Compare 3 PRO(BC3 PRO)和Araxis Merge都具有3路比较和合并功能。 BC3 Pro只有50美元,是您用来处理合并和交互式差异的最佳编程工具之一。 – Adisak 2010-01-29 19:07:35

回答

11

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

+0

该KB链接已死亡,我在这里找到了一个档案:http://www.java2s.com/Code/CSharp/File-Stream/Comparesthecontentof2files.htm – 2016-03-03 22:20:59

10

最快的方法是比较流中加载的文件的字节到字节。散列这两个文件对于大文件来说将花费太长时间,字符串也会比较长,外部工具也是如此。

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

如果你使用散列比较,字符串比较或外部工具,你必须在你比较的时候浏览整个文件,比较字节到字节只会在它们完全相同的情况下才能做到。

+1

+1:简单,高效,100%正确,显然最快 – chburd 2010-01-29 16:33:40

+3

技术上不是最快的。最快的方法是首先检查文件大小,以减少拒绝。此外,与IO时间相比,计算简单哈希的时间量可能会很小 - 首先请确保您正在执行的文件缓存大小合适的文件读取。此外,哈希比较没有解析整个文件来拒绝 - 你可以将数据分块并比较哈希块。使用处理器高速缓存预取的块化散列cmp比天真的字节比较快2-3倍(但它可能不会像SIMD/SIAR cmp w /预取一样快)。另外你可以轻松地多线程哈希或cmp的。 – Adisak 2010-01-29 16:53:51

3

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

+0

+1我已经实施了这个解决方案。每次都很棒。 – 2010-01-29 16:25:58

+1

是的,效果很好,性能不好,试着比较两个文件与每个100MB,这将需要很长时间,无论文件有多么不同,做逐字节将停止整个过程中的第一个不同它发现的字节。 – Tufo 2010-01-29 16:28:03

+0

+1 @Tufo - 好点。 – 2010-01-29 16:28:39

0

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

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

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

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

} 
+0

我建议装饰缓冲流的FileStream,或阅读通过块的流。 – 2010-01-29 18:00:36

+0

我似乎已经缓冲了FileStream,http://blogs.msdn.com/b/brada/archive/2004/04/15/114329.aspx,所以我认为任何包装都不会有帮助。 – derkyjadex 2012-10-12 10:47:31

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

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

1

这也取决于你想要解决什么。你想回答这个问题:在N个文件的这个目录中,找到所有确切的重复项?还是这两个文件完全一样?

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

但是,如果您试图在N个文件中查找所有重复对,则MD5哈希值会更好,因为您可以创建并存储一次MD5哈希值,并将这个小得多的值与每对文件进行比较。其他方面,你会迭代每个文件字节流为目录中的每个其他文件。

1

我在一年前实现了一个非常特殊的版本(我有超过6GB的文件,然后必须进行比较)。所以我知道差异的内部工作(当然,复制&粘贴的批次)。一些想法:

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

我可以,如果你想用代码贡献。 Diff'ing文件比较复杂,因为您也会输出不同的内容。

相关问题