Cómo usar el 7z SDK para comprimir y descomprimir un archivo

De acuerdo con este enlace ¿Cómo creo archivos 7-Zip con .NET? , WOPR nos dice cómo comprimir un archivo con LMZA (algoritmo de compresión 7z) usando 7z SDK ( http://www.7-zip.org/sdk.html )

using SevenZip.Compression.LZMA; private static void CompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder(); using (FileStream input = new FileStream(inFile, FileMode.Open)) { using (FileStream output = new FileStream(outFile, FileMode.Create)) { coder.Code(input, output, -1, -1, null); output.Flush(); } } } 

Pero, ¿cómo descomprimirlo?

Lo bash :

 private static void DecompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); using (FileStream input = new FileStream(inFile, FileMode.Open)) { using (FileStream output = new FileStream(outFile, FileMode.Create)) { coder.Code(input, output, input.Length, -1, null); output.Flush(); } } } 

pero sin éxito.

¿Tienes un ejemplo de trabajo?

Gracias

PS: Según otro código http://www.koders.com/csharp/fid43E85EE5AE7BB255C69D18ECC3288285AD67A4A4.aspx?s=zip+encoder#L5 , parece que el decodificador necesita un encabezado, un diccionario al principio del archivo para trabajar . Este archivo generado por Koders no es un archivo 7z.

  public static void Decompress(Stream inStream, Stream outStream) { byte[] properties = new byte[5]; inStream.Read(properties, 0, 5); SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); decoder.SetDecoderProperties(properties); long outSize = 0; for (int i = 0; i < 8; i++) { int v = inStream.ReadByte(); outSize |= ((long)(byte)v) << (8 * i); } long compressedSize = inStream.Length - inStream.Position; decoder.Code(inStream, outStream, compressedSize, outSize, null); } 

OutSize se calcula de la misma manera que su método Compress. Pero ¿cómo calcular el tamaño de salida de lo contrario?

Esta pregunta es un poco antigua, pero Google no proporciona una respuesta satisfactoria, así que esto es para aquellos que todavía la buscan. Si observa la carpeta LMZAAlone del SDK, hay un código que comprime y descomprime archivos. Utilizándolo como ejemplo, parece que necesita escribir y leer las propiedades del codificador y descomprime el tamaño del archivo en su archivo de salida:

 private static void CompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder(); FileStream input = new FileStream(inFile, FileMode.Open); FileStream output = new FileStream(outFile, FileMode.Create); // Write the encoder properties coder.WriteCoderProperties(output); // Write the decompressed file size. output.Write(BitConverter.GetBytes(input.Length), 0, 8); // Encode the file. coder.Code(input, output, input.Length, -1, null); output.Flush(); output.Close(); } private static void DecompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); FileStream input = new FileStream(inFile, FileMode.Open); FileStream output = new FileStream(outFile, FileMode.Create); // Read the decoder properties byte[] properties = new byte[5]; input.Read(properties, 0, 5); // Read in the decompress file size. byte [] fileLengthBytes = new byte[8]; input.Read(fileLengthBytes, 0, 8); long fileLength = BitConverter.ToInt64(fileLengthBytes, 0); coder.SetDecoderProperties(properties); coder.Code(input, output, input.Length, fileLength, null); output.Flush(); output.Close(); } 

Tenga en cuenta que los archivos creados de esta manera también se pueden extraer mediante el progtwig 7zip, pero no conservarán su nombre de archivo ni ningún otro metadato.

Recomiendo managed-lzma:
https://github.com/weltkante/managed-lzma

Conserva la información del archivo y la estructura del directorio en la encoding del archivo.

    Intereting Posts