2012-02-11 72 views
1

在.NET中,我需要一種方法來比較兩個文件。我想到一個類,它代表一個差異:獲取兩個文件的差異

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

名稱應該是不言自明的。我想爲每個條目添加一個狀態,以便我可以區分第一個文件大於第二個文件的情況,反之亦然。

我想知道,如果有一個共同的和快速的方式來檢索兩個文件的逐字節的差異。我只是簡單地爲每個文件創建一個流,然後比較這些流的塊,直到結束。有沒有更好的方法,還是框架有一個內置的解決方案?請記住,我需要自己的差異,不僅僅是反饋意見有差異。

//編輯:

對這個問題每天睡後,我想我採取了錯誤的方式在這裏。整個工具是一個備份解決方案,它只能保存更改的字節,從而減少備份的整體必要空間。而不是每次保存一個壓縮的14 MB文件,只保存200k或更少的文件。

但是,在考慮了這個問題之後,我意識到僅僅保存每個字節的差異是不夠的。以文本爲例:

「這是一個字符串。」 「這是一個字符串。」

事實上,這裏唯一的變化是「是」到「是」。但是我的方法會假定改變的內容現在「是一個字符串」。如果這發生在一個巨大文件的開頭,那麼這種方法是無用的。 顯然,我需要一種方法來索引一個文件並檢測所有移動,複製或更改的塊與原始文件相比較。 P ...

+0

你需要比較哪種文件?文本?圖片? ... – 2012-02-11 13:34:59

+0

這些文件可以是任何形式,這就是爲什麼我採取字節的方法... – 2012-02-11 14:32:50

+0

在這種情況下,你可以定義什麼'新',''刪除'和'改變'意味着例如在圖像文件?或者在'.doc'文件中?這些概念在一般情況下很難理解。 – 2012-02-11 14:37:58

回答

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 Compression得到一些有益的思路和Optimizing File Replication over Limited-Bandwidth Networks using Remote Differential Compression

對於文本文件差別,我建議先從An O(ND) Difference Algorithm and Its Variations尤金·W·邁爾斯。這個算法可以用來區分任何兩個序列。爲了比較兩個文本文件,爲每個文件中的每一行生成哈希代碼序列(例如,通過調用string.GetHashCode())。然後通過Myers的算法運行這些序列(例如IList)以找到將第一序列轉換爲第二序列的最短編輯腳本(即,插入和刪除)。

我希望這會有所幫助。我是Diff.Net的作者,它使用伯恩斯二進制差異算法和邁爾斯算法進行文本差異化。 Diff的源代碼。Net的庫(Menees.DiffsMenees.Diffs.Controls)在Apache許可證2.0版下提供,上面的參考文獻應該可以幫助您實現自己的解決方案,而無需從頭開始。

相關問題