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

标签 c# sdk 7zip compression lzma

根据此链接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();
                }
            }
        }

但没有成功。

你有一个有效的例子吗?

谢谢

附言: 根据其他代码 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 程序提取,但不会保留其文件名或任何其他元数据。

关于c# - 如何使用7z SDK压缩和解压文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7646328/

相关文章:

c# - ASP.NET 成员资格中的多个安全问题

c# - 脚本资源错误 : This is an invalid script resource request

c# - 哪个数据集行违反了数据库唯一约束?

c# - puppeetersharp 中的单页 PDF

shell - 为什么解压tar.gz文件时出现重复文件

java - Admob 6.4.1 - 膨胀类 com.google.ads.AdView 时出错

ios - 如何在 ios 应用程序中实现数码相框?

android - MonkeyRunner NoClassDefFoundError : com/android/chimpchat/ChimpChat

cmd - 通过cmd命令解压文件(7-zip)

java - 7zip 命令行 - 创建可执行 jar