如何使用7z SDK压缩和解压缩文件

根据此链接如何使用.NET创建7-Zip压缩文件? ,WOPR告诉我们如何使用7z SDK( http://www.7-zip.org/sdk.html )使用LMZA(7z压缩算法)压缩文件

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(); } } } 

但是如何解压呢?

我试试:

 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(); } } } 

但没有成功。

你有一个有效的例子吗?

谢谢

PS:根据其他代码http://www.koders.com/csharp/fid43E85EE5AE7BB255C69D18ECC3288285AD67A4A4.aspx?s=zip+encoder#L5 ,似乎解码器需要一个头,一个字典在文件的开头才能工作。 由Koders生成的此文件不是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的计算方式与它们的Compress方法相同。 但是如何计算输出大小呢?

这个问题有点老了,但谷歌未能提供令人满意的答案,所以这对于像我一样的人仍在寻找它。 如果您查看SDK的LMZAAlone文件夹,则会有压缩和解压缩文件的代码。 使用它作为示例,您似乎需要编写和读取编码器属性并将文件大小解压缩到输出文件:

 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(); } 

请注意,以这种方式创建的文件也可以通过7zip程序提取,但不会保留其文件名或任何其他元数据。

我强烈推荐managed-lzma:
https://github.com/weltkante/managed-lzma

它以文件编码保留文件信息和目录结构。