2012-05-04 15 views
7

Qualcuno ha potuto eseguire la compressione in un ambiente .NET per generare delta tra i file. Mi piacerebbe utilizzare questa funzionalità se possibile, forse utilizzando la funzionalità in msdelta.dll. Sarei anche interessato a come generare delta usando altre librerie (preferibilmente open source).Delta compressione in .NET

+0

[xdelta] (http://xdelta.org/) è l'open source che ho visto usato più. Non sono sicuro di quanto sia facile chiamare da C#, comunque. – Rup

+0

Grazie. Ho controllato il tuo link e trovato un altro collegamento (http://www.pobox.com/~skeet/csharp/miscutil), che ha c versione # decoder. Tuttavia, avrò bisogno anche di un encoder. – dubs

risposta

6

spero che questo non è troppo di una spina spudorato, ma ho scritto una libreria wrapper sia PatchAPI e MSDelta per i miei scopi.

La biblioteca è dual-rilasciato sotto licenza MS-PL e DBAD-PL e disponibile sul GitHub.

sto intrattenere la nozione di pubblicazione del progetto sul NuGet, ma per il momento è possibile scaricare il sorgente e sia creare e applicare delta.

Creazione di un delta deve essere auto-esplicativo:

var compression = new MsDeltaCompression(); /* or PatchApiCompression(); */ 
compression.CreateDelta(sourcePath, destinationPath, deltaPath); 

e altrettanto auto-esplicativo (si spera) è applicare un delta:

var compression = new MsDeltaCompression(); /* or PatchApiCompression(); */ 
compression.ApplyDelta(deltaPath, sourcePath, destinationPath); 

provata su x86, ma il P/Invoke firme dovrebbe essere ugualmente valido per x64 e ia64.

Se hai Non ho ancora deciso se si sta utilizzando PatchAPI o MSDelta, del mio progetto README.md cerca di suggerire (brevemente) che uno si dovrebbe usare, ma per il resto the documentation for Microsoft's Delta Compression ha questo da dire circa MSDelta vs. PatchAPI:

MSDelta ... può creare molto più piccoli file compressi rispetto a quelli prodotti da altri metodi. Spedizione con Windows Vista, è la prossima generazione della tecnologia precedentemente rilasciata come PatchAPI (che continuerà ad essere supportata).

Enfasi mia.

+0

[Il NuGet Package] (http: // NuGet.org/pacchetti/DeltaCompressionDotNet /). –

+1

Grande biblioteca ta.speot.is. Ero curioso di sapere se ci fosse la possibilità di ampliarlo per creare file di firma, in questo modo se sto lavorando in rete non devo trasferire l'intero file sulla rete per ottenere il delta, e invece basta trasferire il file delta. – ymerej

+0

@Jeremy Grazie. Stai chiedendo una sorta di delta patch server, dove gli mandi un hash della versione attuale del tuo file e ti rimanda una patch per aggiornarla con l'ultima? –

1

Fossil SCM ha un algoritmo di compressione delta implementato in C, e ho fatto una porta di esso su C# qui: https://github.com/endel/FossilDelta

Per creare il delta, è necessario fornire un byte[] l'origine e la destinazione. Viene restituito come byte[], che è possibile applicare in un secondo momento.

byte[] origin = System.IO.File.ReadAllBytes ("old-file"); 
byte[] target = System.IO.File.ReadAllBytes ("new-file"); 
byte[] delta = Fossil.Delta.Create(origin, target); 

Avere il delta, è possibile applicare le modifiche nel file originale come questo:

byte[] applied = Fossil.Delta.Apply(origin, delta); 

penso che la pena ricordare che l'autore di questo algoritmo è lo stesso autore di SQLite - in modo che ha una certa credibilità.