varios usar sirve separado que portable por para maximo documento descomprimir descargado comprimir comprimido como archivos archivo abrir c# sdk 7zip decompression lzma

c# - usar - comprimir varios archivos por separado 7zip



Cómo usar el SDK de 7z para comprimir y descomprimir un archivo (2)

Esta pregunta es un poco antigua, pero Google no proporciona una respuesta satisfactoria, por lo que es para aquellos que, como yo, todavía lo buscan. Si observa la carpeta LMZAAlone del SDK, existe un código que comprime y descomprime los archivos. Usándolo como ejemplo, parece que necesita escribir y leer las propiedades del codificador y descomprime el tamaño del archivo a 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 pueden ser extraídos por el programa 7zip, pero no conservarán su nombre de archivo ni ningún otro metadato.

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 intento :

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

PD: 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 funcionar . 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); }

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