2011-10-04 38 views
15

このリンクHow do I create 7-Zip archives with .NET?によると、WOPRが7z SDK(http://www.7-zip.org/sdk.htmlファイルを圧縮して解凍する7zのSDKを使用する方法

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

を使用して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(); 
       } 
      } 
     } 

成功せず。

実例がありますか?

おかげ

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メソッドと同じ方法で計算されます。しかし、それ以外の方法で出力サイズを計算する方法はありますか?

+0

例外はありますか?エラーメッセージ? – PVitt

+0

I [i]が.INIT() 'm_Coders上とNullReferenceExceptionを取得します。ここではもう少し完全な答えもあり、クラスLiteralDecoder – Djax

+0

の)初期化中に' (: http://stackoverflow.com/は、 a/8775927/220904 – Vando

答えて

26

この質問はもう少し古いですが、Googleでは満足のいく回答を出すことができないため、これはまだ私が探しているようなものです。 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をプログラムによって抽出できることが、:例として、それを使用すると、あなたがエンコーダのプロパティを読み書きする必要があり、あなたの出力ファイルにファイルサイズを圧縮解除すると思われますファイル名やその他のメタデータは保持されません。
https://github.com/weltkante/managed-lzma

これは、ファイルのエンコーディングでファイル情報やディレクトリ構造を維持する:

+0

これは古いコメント(と投稿)ですが、私はこのコードを試しても動作しません。新しいアーカイブファイルを開くとき、Windows 10はそれが無効であると言い、それを開けません。 –

+0

私は7zipプログラムとライブラリの最新バージョンで試してみましたが、それでも私にとってはうまくいきます。 Windows 10が無効だと言ったことはどういう意味ですか? Windowsエクスプローラに組み込まれている圧縮ファイルビューアでファイルを開こうとしていますか?私はそれが7zip/LZMAをサポートしているとは思わない。 – Fr33dan

+0

Windows 10のアーカイブビューアは.7zをサポートしていません。ただし、アーカイブされたファイルを抽出するときにコードが機能しますが、ファイル拡張子は入力文字列に含まれていても表示されません。ファイルはまだ有効です。拡張機能がありません。どのようにこれを修正できますか? –

1

は、私は非常に管理-LZMAをお勧めします。

関連する問題