2012-02-25 16 views
1

(OK,我不吆喝,這是非常晚在這裏:))製作沒有基礎(源)文件的增量文件?

我研究三角DIFF工具(命令行工具或部件,它並不重要,只要我可以從給他們打電話德爾福2010

我有這個項目上傳文件到服務器,我需要優化上傳,所以它真的很好,如果我只能上傳增量文件而不是發送新文件,然後比較兩個舊&服務器上的新文件版本。

我讀到口是心非here

口是心非是rdiff進行備份的變化,允許備份,而不從 存儲服務器合作,與像亞馬遜S3簡單存儲服務。它的工作原理是 提前爲每個塊生成散列,對它們進行加密,並將它們存儲在 服務器上,然後在執行增量備份時檢索它們。其餘的數據是 也出於安全目的加密存儲。

這引起了我的思維,是有工具(或方式)來生成一個補丁或delta文件(我不知道正確的術語是什麼)基礎上,文件,沒有有權訪問原始文件?

我的意思是讓我們說我有這個文件,我修改一次:

my-data.db 
[ my-data.db ] modified  --> [ delta-file-1.diff ] 

有沒有一種方法來構建[增量文件1.diff]根據新的文件無需訪問舊文件? (可能是通過爲原始文件存儲某種簽名?)

我研究了很多這個主題(rdiff,PatchAPI,ZDelta,XDelta,MSDelta等等)但我找不到任何真實的 - 世界上的這個工作的例子。

這些參考文獻討論了這個問題,但我想聽聽是否有人能指導我和/或提出更好的工具來回答我上面提出的問題。

Compressing a Target Without a Source File

Windows Patch API: Compressing a Target Without a Basis (Source) File

提前感謝!

+0

你想知道A和B之間的區別,而不知道A? – kay 2012-02-25 06:45:02

+0

@Kay:點好了,我寧願說我想得到A和B之間的區別,只有A的「簽名」在手(一系列哈希標識A可能是?)...有真的沒有羞恥的要求,你知道 – TheDude 2012-02-25 06:55:33

+0

@Ken:請閱讀我的評論[這裏](http://stackoverflow.com/questions/9441801/making-delta-file-without-a-basis-source-file#comment12047688_9442106) ,確實有辦法做到這一點,唯一需要了解的是哪個工具是最好的(我只能找到一個軟件來做到這一點:rdiff) – TheDude 2012-03-01 08:23:36

回答

1

對於那些有興趣:有rdiff裏面確實有一個Windows端口,可以從德爾福推出,並librsync是,如果我理解正確的話,後面使用rdiff發動機。

兩者都需要簽名舊文件(這是小於文件本身)和完整的新文件。

反向增量可以完成以允許從舊的文件獲取新的文件。

1

當你只追加到一個文件或編輯已知大小的塊(最有可能不可能的文本文件),我猜哈希是可行的。請參閱eMule的AICH(eMule wiki/aMule wiki)。

實質上,您將文件分割成大小爲N的塊,然後計算每個塊的哈希碼。然後你計算M塊中的「超級哈希」。採用這種方法,您可以追蹤更改的塊,而無需傳輸太多的元數據。

否則:您不能在不知道差異的基礎上創建整個文件。如果不知道基地,你也不能創造差異。

+1

謝謝,是的!這是我心中所想的(散列每個片/集團)。然而,我很懷疑,但你對超級哈希的想法是非常有趣的,可能很好的伎倆......我要看看它,謝謝! – TheDude 2012-02-25 13:35:30

+1

@Gdhami'rsync'通過計算塊的散列(因此只需發送實際不同的塊的差異,而不是通過線發送A和B之間的完整差異)。但它仍然需要完整的A和完整的B. – 2012-02-25 17:58:39

+0

@JeroenWiertPluimers:我有點希望找到一些「神奇」的方式來實現這一點。謝謝你們的幫助,我真的很感激! – TheDude 2012-02-28 04:27:41

1

不,你不能沒有辦法得到A和B的區別來獲得A和B

你可以從舊版本A和應用的差異重建。 A的簽名不會削減它。

+0

在我的問題中提到的MSDN鏈接中,我發現這樣:「在沒有源文件的情況下壓縮目標文件 描述如何在不引用源文件的情況下使用API​​函數創建增量。」 – TheDude 2012-02-25 13:32:44

+0

我對MS沒有太多的信心,但是除非我誤解了這一點,它似乎有點可能(?) – TheDude 2012-02-25 13:33:18

+0

無論MS有什麼信仰,我都認爲你誤讀了[link](http://msdn.microsoft.com/ en-us/library/bb417345.aspx#patchapi_comptarg)你在你編輯的問題中提到過。該鏈接指出如​​果調用CreatePatch函數並且源文件被指定爲NULL或INVALID_HANDLE_VALUE,則輸出將是目標文件的壓縮表示。這意味着增量將只描述目標B,而不是來源A和目標B. – 2012-02-25 17:56:15