代码之家  ›  专栏  ›  技术社区  ›  Bryan Anderson

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

  •  7
  • Bryan Anderson  · 技术社区  · 15 年前

    什么是 最容易的 如何找出两个文本文件在编程上是否不同?如果有两个文件,我只需要知道它们是否不同。这是一个快速的工具来帮助完成一个特别讨厌的合并(在一个分支(yay!)中将语言从vb切换到c)。在另一个方面做了很多改变),它将不会投入生产。

    可能的解决方案:

    1. 散列两个文件并比较散列
    2. 将文件拉入,然后进行字符串比较
    3. 调用外部diff工具(不幸的是,WinMerge没有用于此操作的CLI)

    如果可能的话,忽略空白是很好的,但我不太在乎。最主要的是它需要快速和容易。

    顺便说一下,我用的是.NET 3.5SP1。谢谢你的建议。

    8 回复  |  直到 8 年前
        1
  •  11
  •   Steffen    15 年前

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

        2
  •  10
  •   Jørn Schou-Rode dscher    15 年前

    最快的方法是将流中加载的文件的字节与字节进行比较。对大型文件、字符串比较和外部工具来说,哈希这两个文件都将花费太长时间。

    比较字节对您来说是最好的,因为只有当两个文件都相同时,它才会到达文件的EOF。

    如果您进行哈希比较、字符串比较或外部工具,那么您必须在比较的所有时间内检查整个文件,只有在它们相同的情况下才进行字节对字节的比较。

        3
  •  4
  •   Alex LE    15 年前

    逐字节检查,下面是一些代码:

    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;
            }
        }
    
    }
    
        4
  •  3
  •   Tim Cooper    13 年前

    使用MD5哈希算法可以比较结果吗?这里有一个 example .

        5
  •  1
  •   Turbo    15 年前

    这还取决于你要解决的问题。你想回答这个问题吗:在这个由n个文件组成的目录中,找到所有完全重复的文件?还是这两个文件完全相同?

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

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

        6
  •  1
  •   Bruno Brant    15 年前

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

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

    如果你愿意,我可以用代码来做贡献。不同的文件更复杂,因为您还将输出不同的内容。

        7
  •  0
  •   Russell Steen    15 年前

    从这个问题- 最容易的 和文本文件

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

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

        8
  •  0
  •   demonplus    8 年前
    if ( $file1 != $file2 ) return true;
    

    当然,这在vb和c之间是不同的#