2016-11-23 72 views
2

你可以推薦我任何Windows(最好是.NET)庫,它允許壓縮rsync兼容的數據,即以gzip --rsyncable的方式工作。我發現了zlib的一些請求更改,但似乎尚未實現。我試圖使用一些並行壓縮算法,認爲它可以在塊上獨立進行壓縮,但沒有運氣(原始文件中的任何更改都會使壓縮的完全更改)。Rsyncable壓縮庫

- > EDIT

我抓住露出的ZLib同步模式和4096常量緩衝器和同步沖洗模式使用它,但即使在再次輸入文件的微小變化使一個輸出文件是一個DotNetZip庫完整性不同。我能做錯什麼?

using (var inputStream = new FileStream("file.in", FileMode.Open)) 
using (var outputStream = new FileStream("file.out", FileMode.Create)) 
{ 
    using (var compressor = new DeflateStream(outputStream, Ionic.Zlib.CompressionMode.Compress)) 
    { 
     byte[] buffer = new byte[4096]; 
     int n; 
     while ((n = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      compressor.FlushMode = FlushType.Sync; 
      compressor.Write(buffer, 0, n); 
      compressor.Flush(); 
      // actually, Flush() is not needed, DeflateStream automatically flushes on every write. 
     } 
    } 
} 
+1

當你做同步不能簡單地定期。它必須依賴於輸入數據。您需要閱讀我提供的源代碼鏈接。 –

+0

@gregi您是否設法在.NET中實現rsyncable defalte壓縮,您能分享代碼嗎? – Stritof

回答

3

您可以使用zlib這一點,它已經提供了所有你需要的。這只是簡單地插入Z_SYNC_FLUSH通常足夠的時間,但不是太頻繁,由未壓縮數據中的模式觸發。

你可以看看pigz's implementation中的例子,使用一個非常簡單的輸入數據散列,尋找一個12位模式。您可以使用13位來減少壓縮影響。查看評論。