2012-05-04 7 views
7

¿Alguien ha podido realizar la compresión en un entorno .NET para generar deltas entre los archivos. Me gustaría utilizar esta funcionalidad si es posible, tal vez mediante el uso de la funcionalidad en msdelta.dll. También me interesaría cómo generar deltas utilizando otras bibliotecas (preferiblemente de código abierto).Delta Compression en .NET

+0

[xdelta] (http://xdelta.org/) es el de código abierto que he visto más utilizado. Sin embargo, no estoy seguro de lo fácil que es llamar desde C#. – Rup

+0

Gracias. Revisé su enlace y encontré otro enlace (http://www.pobox.com/~skeet/csharp/miscutil) que tiene la versión del decodificador C#. Sin embargo, necesitaré un codificador también. – dubs

Respuesta

6

espero que esto no es demasiado de un enchufe descarado, pero he escrito una biblioteca envoltorio alrededor de ambos PatchAPI y MSDelta para mis propios fines.

La biblioteca tiene doble licencia bajo MS-PL y DBAD-PL y está disponible en GitHub.

Estoy entretenido con la idea de publicar el proyecto en NuGet, pero por el momento puede descargar la fuente y crear y aplicar deltas.

Creación de un delta debe explicarse por sí mismo:

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

E igualmente explica por sí mismo (con suerte) es la aplicación de un delta:

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

probado en x86, pero el P/Invoke firmas debería ser igualmente válido para x64 e ia64.

Si ha no ha decidido de si se está utilizando PatchAPI o MSDelta, de mi proyecto README.md trata de sugerir (brevemente) cuál debe utilizar, pero por lo demás the documentation for Microsoft's Delta Compression tiene esto que decir acerca de MSDelta vs PatchAPI:

MSDelta ... puede crear archivos comprimidos mucho más pequeñas que las producidas por otros métodos. El envío con Windows Vista es la próxima generación de la tecnología lanzada anteriormente como PatchAPI (que continuará siendo compatible).

Énfasis mío.

+0

[El paquete NuGet] (http: // nuget.org/packages/DeltaCompressionDotNet /). –

+1

Gran biblioteca ta.speot.is. Tenía curiosidad si hay alguna posibilidad de que pueda expandirlo para hacer archivos de firma, de esa manera, si estoy trabajando en la red no tengo que transferir todo el archivo a través de la red para obtener el delta, y en su lugar solo transfiero el delta. – ymerej

+0

@Jeremy Gracias. ¿Está preguntando sobre algún tipo de servidor de parche delta, donde le envía un hash de la versión actual de su archivo y le envía un parche para actualizarlo con el último? –

1

fósil SMC tiene un algoritmo de compresión delta implementado en C, y he hecho un puerto de la misma en C# aquí: https://github.com/endel/FossilDelta

Para crear el delta, debe proporcionar un byte[] del origen y de destino. Se devuelve como byte[], que puede solicitar más tarde.

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

Tener el delta, se puede aplicar los cambios en el archivo original como esto:

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

creo que vale la pena mencionar que el autor de este algoritmo es el mismo autor de SQLite - por lo tiene algo de credibilidad

Cuestiones relacionadas