获取两个文件的差异

时间:2012-02-11 13:32:42

标签: c#

在.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或更少。

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

“这是一个字符串。” “这是一个字符串。”

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

3 个答案:

答案 0 :(得分:2)

没有内置功能。<​​/ p>

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

对于一般案例二元差分,请查看Randal C. Burns和Darrell D. E. Long的A Linear Time, Constant Space Differencing Algorithm。此外,Randal Burns的硕士论文Differential Compression: A Generalized Solution For Binary Files详细介绍了该算法的伪代码。

您可能还会从About Remote Differential CompressionOptimizing File Replication over Limited-Bandwidth Networks using Remote Differential Compression

中获得一些有用的提示

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

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