获取两个文件的差异

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

public enum DiffEntryState { New, Removed, Changed } public class DiffEntry { public byte[] Bytes; public long FileOffset; public DiffEntryState State = BackupByteEntryState.Changed; } 

这些名字应该是不言自明的。 我想到为每个条目添加一个State,这样我就可以区分第一个文件大于第二个文件的情况,反之亦然。

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

//编辑:

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

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

“这是一个字符串。” “这是一根绳子。”

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

看看Diff.NET ,可能会有所帮助。

对于一般情况二元差分,请参阅Randal C. Burns和Darrell DE Long的A线性时间,恒定空间差分算法 。 此外,Randal Burns的硕士论文“ 差分压缩:二进制文件的通用解决方案”更详细地介绍了算法的伪代码。

您还可以从关于远程差分压缩和使用远程差分压缩优化有限带宽网络上的文件复制中获得一些有用的想法

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

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

没有内置function。

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