C# 获取两个文件的差异

C# 获取两个文件的差异,c#,C#,在.NET中,我需要一种方法来比较两个文件。我想到了一个类,它代表了一种差异: public enum DiffEntryState { New, Removed, Changed } public class DiffEntry { public byte[] Bytes; public long FileOffset; public DiffEntryState State = BackupByteEntryState.Changed;

在.NET中,我需要一种方法来比较两个文件。我想到了一个类,它代表了一种差异:

public enum DiffEntryState
{
    New,
    Removed,
    Changed
}    
public class DiffEntry
{
    public byte[] Bytes;
    public long FileOffset;
    public DiffEntryState State = BackupByteEntryState.Changed;
}
这些名字应该是不言自明的。我想为每个条目添加一个状态,这样我就可以区分第一个文件比第二个文件大的情况,或者反之亦然

我想知道,是否有一种通用且快速的方法来检索两个文件的逐字节差异。我只需为每个文件创建一个流,并比较这些流的块,直到其中一个结束。是否有更好的方法,或者框架是否有内置的解决方案?请记住,我需要的是差异本身,而不仅仅是存在差异的反馈

//编辑:

在为这个问题睡了一夜之后,我想我在这里采取了错误的方法。整个工具是一个备份解决方案,它将能够只保存更改的字节,从而减少备份所需的总体空间。每次只保存200k或更少的文件,而不是保存一个压缩的14MB文件

但是,在考虑了这个问题之后,我意识到仅仅一个字节一个字节地保存差异是不够的。以文本为例:

这是一根绳子。 这是一根绳子

事实上,这里唯一的变化就是过去。但我的方法会假设更改的内容现在是一个字符串。如果这发生在一个大文件的开头,那么,这种方法是无用的。 显然,我需要一种方法来索引文件,并检测与原始文件相比的所有移动、复制或更改的块。
呸…

没有内置功能


因此,您必须逐字节比较文件,或者使用一个为您执行此操作的库。

没有内置功能


因此,您必须逐字节比较文件,或者使用一个为您执行此操作的库。

查看,可能会有所帮助。

查看,可能会有所帮助。

对于一般情况下的二进制差分,请查看Randal C.Burns和Darrell D.E.Long的文章。另外,Randal Burns的硕士论文将更详细地介绍该算法,并为该算法提供伪代码

你也可能从中得到一些有用的想法

对于文本文件差异,我建议从Eugene W.Myers开始。该算法可用于区分任意两个序列。要比较两个文本文件,请生成哈希代码序列,例如,为每个文件中的每一行调用string.GetHashCode。然后通过Myers算法运行这些序列,例如IList,以找到最短的编辑脚本,即插入和删除,将第一个序列转换为第二个序列


我希望这有帮助。我是的作者,它使用Burns的二进制差分算法和Myers的文本差分算法。Diff.Net库的源代码和Apache许可证2.0版下提供的源代码,以及上面的参考应该可以帮助您实现自己的解决方案,而无需从头开始。

有关一般情况下的二进制差分,请参阅Randal C.Burns和Darrell D.E.Long的文章。另外,Randal Burns的硕士论文将更详细地介绍该算法,并为该算法提供伪代码

你也可能从中得到一些有用的想法

对于文本文件差异,我建议从Eugene W.Myers开始。该算法可用于区分任意两个序列。要比较两个文本文件,请生成哈希代码序列,例如,为每个文件中的每一行调用string.GetHashCode。然后通过Myers算法运行这些序列,例如IList,以找到最短的编辑脚本,即插入和删除,将第一个序列转换为第二个序列


我希望这有帮助。我是的作者,它使用Burns的二进制差分算法和Myers的文本差分算法。Diff.Net库的源代码和在Apache许可证2.0版下提供,上述参考资料将帮助您实现自己的解决方案,而无需从头开始。

您需要比较哪种文件?文本图像。。。文件可以是任何类型的,这就是为什么我采用字节方法…在这种情况下,你能定义什么是新的、删除的和更改的,例如在图像文件中?还是在.doc文件中?在一般情况下,这些概念几乎没有意义。我编辑了我的原始帖子来澄清一些事情……我成功使用的一个单独的文件库来处理差异:你需要比较什么类型的文件?文本图像。。。文件可以是任何类型的,这就是为什么我采用字节方法…在这种情况下,你能定义什么是新的、删除的和更改的,例如在图像文件中?还是在.doc文件中?这些概念在一般情况下几乎没有意义。我编辑了我的原始帖子,以澄清一些事情……我成功使用的一个单独的文件库来处理diffing: