【发布时间】:2011-10-04 10:14:23
【问题描述】:
根据此链接How do I create 7-Zip archives with .NET?,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 方法相同。但是如何计算输出大小?
【问题讨论】:
-
有例外吗?错误信息?
-
我在类 LiteralDecoder 的 Init() 中的
m_Coders[i].Init();上得到 NullReferenceException -
这里也有更完整的答案:stackoverflow.com/a/8775927/220904
标签: c# sdk 7zip compression lzma