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

C# 如何使用7z SDK压缩和解压缩文件,c#,sdk,7zip,compression,lzma,C#,Sdk,7zip,Compression,Lzma,根据这个链接,WOPR告诉我们如何使用7zSDK()使用LMZA(7z压缩算法)压缩文件 但是如何解压呢 我尝试: private static void DecompressFileLZMA(string inFile, string outFile) { SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); using

根据这个链接,WOPR告诉我们如何使用7zSDK()使用LMZA(7z压缩算法)压缩文件

但是如何解压呢

我尝试:

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();
                }
            }
        }
但是没有成功

你有一个有效的例子吗

谢谢

附言: 根据另一段代码,解码器似乎需要一个头,文件开头的一个字典才能工作。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);
    }
公共静态无效解压缩(流内流、流外流)
{
字节[]属性=新字节[5];
流内读取(属性,0,5);
SevenZip.Compression.LZMA.Decoder解码器=新的SevenZip.Compression.LZMA.Decoder();
解码器.SetDecoderProperties(属性);
长超尺寸=0;
对于(int i=0;i<8;i++)
{
int v=inStream.ReadByte();

超大|=((长)(字节)v)这个问题有点老了,但是谷歌没有提供一个令人满意的答案,所以这是给那些像我一样仍在寻找它的人的。如果你查看SDK的LMZAONE文件夹,有一些压缩和解压缩文件的代码。以它为例,你似乎需要编写和读取编码器属性并解压缩文件调整到您的输出文件:

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

我强烈建议使用托管lzma:


它在文件编码中保留了文件信息和目录结构。

我需要LZMA压缩来通过网络发送图像,不确定这是最好的选择,但至少它在我的生态系统中起作用!因此,这里有一些东西应该可以立即用于此目的

using System;
using System.IO;
using SevenZip;

  public class LZMA{
    public static byte[] Compress(byte[] toCompress)
      {
        SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();

        using(MemoryStream input = new MemoryStream(toCompress))
        using(MemoryStream output = new MemoryStream()){

          coder.WriteCoderProperties(output);

          for (int i = 0; i < 8; i++) {
            output.WriteByte((byte)(input.Length >> (8 * i)));
          }

          coder.Code(input, output, -1, -1, null);
          return output.ToArray();
        }
      }

    public static byte[] Decompress(byte[] toDecompress)
    {
        SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();

        using(MemoryStream input = new MemoryStream(toDecompress))
        using(MemoryStream output = new MemoryStream()){

          // 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);

          return output.ToArray();
        }
    }
  }
使用系统;
使用System.IO;
使用SevenZip;
公共类LZMA{
公共静态字节[]压缩(字节[]压缩)
{
SevenZip.Compression.LZMA.Encoder=新的SevenZip.Compression.LZMA.Encoder();
使用(MemoryStream输入=新的MemoryStream(toCompress))
使用(MemoryStream输出=新的MemoryStream()){
coder.WriteCoderProperties(输出);
对于(int i=0;i<8;i++){
output.WriteByte((字节)(input.Length>>(8*i));
}
代码(输入,输出,-1,-1,空);
返回输出.ToArray();
}
}
公共静态字节[]解压缩(字节[]到解压缩)
{
SevenZip.Compression.LZMA.Decoder=新的SevenZip.Compression.LZMA.Decoder();
使用(MemoryStream输入=新的MemoryStream(toDecompress))
使用(MemoryStream输出=新的MemoryStream()){
//读取解码器属性
字节[]属性=新字节[5];
读取(属性,0,5);
//读取解压缩文件的大小。
字节[]fileLengthBytes=新字节[8];
读取(fileLengthBytes,0,8);
long fileLength=BitConverter.ToInt64(fileLengthBytes,0);
编码器。设置解码器属性(属性);
coder.Code(输入、输出、输入、长度、文件长度、null);
返回输出.ToArray();
}
}
}

是否有异常?错误消息?我在LiteralDecoder类的Init()中的
m_Coders[I].Init()上得到了一个NullReferenceException。这里还有一些更完整的答案:我知道这是一个旧注释(和帖子),但我尝试了此代码,但它不起作用。打开新存档文件时,Windows 10表示该文件无效,无法打开。我使用最新版本的7zip程序和库进行了尝试,但它仍然适用于我。Windows 10表示该文件无效是什么意思?您是否尝试使用Windows内置的压缩文件查看器打开该文件资源管理器?我认为它不支持7zip/LZMA。事实证明,Windows 10的存档查看器不支持.7z。但是,您的代码可以工作,在提取存档文件时,文件扩展名似乎不存在,即使它包含在输入字符串中。该文件仍然有效,只是缺少扩展名;您如何更正此问题?答案中说明文件名和所有其他元数据丢失。此问题和答案是关于使用7zip sdk解压缩文件的,使用7zip应用程序压缩要解压缩的文件的问题超出了此问题的范围。我们创建的文件完全可以用程序解压这一事实是一个错误n意外的奖励。此项不正确并导致存档文件损坏:output.Write(BitConverter.GetBytes(input.Length),0,8;替换为:for(int i=0;i<8;i++){outputStream.WriteByte((Byte)(inputStream.Length>(8*i));}
using System;
using System.IO;
using SevenZip;

  public class LZMA{
    public static byte[] Compress(byte[] toCompress)
      {
        SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();

        using(MemoryStream input = new MemoryStream(toCompress))
        using(MemoryStream output = new MemoryStream()){

          coder.WriteCoderProperties(output);

          for (int i = 0; i < 8; i++) {
            output.WriteByte((byte)(input.Length >> (8 * i)));
          }

          coder.Code(input, output, -1, -1, null);
          return output.ToArray();
        }
      }

    public static byte[] Decompress(byte[] toDecompress)
    {
        SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();

        using(MemoryStream input = new MemoryStream(toDecompress))
        using(MemoryStream output = new MemoryStream()){

          // 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);

          return output.ToArray();
        }
    }
  }