2012-05-04 9 views
7

Hat jemand in einer .NET-Umgebung Komprimierung durchführen können, um Deltas zwischen Dateien zu generieren. Ich möchte diese Funktionalität, wenn möglich, vielleicht mit der Funktionalität in msdelta.dll verwenden. Ich würde auch interessieren, wie man Deltas unter Verwendung anderer Bibliotheken (Open Source vorzugsweise) erzeugt.Delta-Komprimierung in .NET

+0

[xdelta] (http://xdelta.org/) ist die Open-Source-Version, die ich am häufigsten benutzt habe. Nicht sicher, wie einfach es ist, von C# aus anzurufen. – Rup

+0

Danke. Ich habe Ihren Link überprüft und einen anderen Link (http://www.pobox.com/~skeet/csharp/miscutil) gefunden, der eine C# -Decoder-Version hat. Ich werde aber auch einen Encoder benötigen. – dubs

Antwort

6

Ich hoffe, dies nicht zu viel von einer schamlosen Werbung ist, aber ich habe eine Wrapper-Bibliothek um beide und MSDelta für meine eigenen Zwecke PatchAPI geschrieben.

Die Bibliothek ist unter der MS-PL und DBAD-PL dual-lizensiert und unter GitHub erhältlich.

Ich unterhalte die Idee, das Projekt auf NuGet zu veröffentlichen, aber für den Moment können Sie die Quelle herunterladen und Deltas erstellen und anwenden.

ein Delta anlegen sollte selbsterklärend sein:

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

Und ebenso selbsterklärend (hoffentlich) eine Delta-Anwendung:

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

auf x86 getestet, aber die P/Invoke Unterschriften sollte für x64 und ia64 gleichermaßen gelten.

Wenn Sie noch auf nicht entschieden haben, ob Sie mein Projekt PatchAPI oder MSDelta, README.md verwenden versucht (kurz) vorzuschlagen, die Sie verwenden sollten, aber ansonsten the documentation for Microsoft's Delta Compression hat dies zu sagen MSDelta vs. PatchAPI:

MSDelta ... viel kleiner komprimierte Dateien als diejenigen, die durch andere Verfahren hergestellt erstellen. Es wird mit Windows Vista ausgeliefert und ist die nächste Generation der Technologie, die zuvor als PatchAPI veröffentlicht wurde (die weiterhin unterstützt wird).

Schwerpunkt meiner.

+0

[Das NuGet-Paket] (http: // nugget.org/Pakete/DeltaCompressionDotNet /). –

+1

Große Bibliothek ta.speot.is. Ich war neugierig, ob es eine Möglichkeit gibt, die Sie erweitern könnten, um Signaturdateien zu erstellen. Wenn ich also über das Netzwerk arbeite, muss ich nicht die gesamte Datei über das Netzwerk übertragen, um das Delta zu erhalten Delta. – ymerej

+0

@ Jeremy Danke. Fragen Sie nach einer Art Delta-Patch-Server, wo Sie ihm einen Hash der aktuellen Version Ihrer Datei schicken und er Ihnen einen Patch zurücksendet, um ihn mit dem neuesten zu aktualisieren? –

1

Fossil SCM hat einen Delta-Kompressionsalgorithmus in C implementiert, und ich habe einen Hafen auf C# hier gemacht: https://github.com/endel/FossilDelta

das Delta zu erstellen, Sie eine byte[] der Herkunft und Ziel bereitstellen muss. Es wird als byte[] zurückgegeben, die Sie später anwenden können.

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

Mit der Delta, können Sie die Änderungen in der Originaldatei wie folgt anwenden:

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

ich denke, es erwähnenswert, dass der Autor dieses Algorithmus der gleiche Autor von SQLite ist - so ist es hat etwas Glaubwürdigkeit.