27

このリンクによると、.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 メソッドと同じ方法で計算されます。しかし、そうでなければ出力サイズを計算する方法は?

4

3 に答える 3

39

この質問は少し古いですが、グーグルは満足のいく答えを提供できていないので、これは私のようなまだ探している人向けです. 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 プログラムでも解凍できますが、ファイル名やその他のメタデータは保持されないことに注意してください。

于 2011-12-22T15:12:32.617 に答える
4

managed-lzma を強くお勧めします:
https://github.com/weltkante/managed-lzma

ファイルエンコーディングでファイル情報とディレクトリ構造を保持します。

于 2015-05-30T10:11:28.900 に答える