2012-03-12 34 views
2

Here在這篇文章中提到了如何使用LZMA SDK來壓縮和解壓縮文件。
這裏是代碼:
如何使用.NET創建包含多個文件的7-Zip存檔?

public static void CompressFileLZMA(string inFile, string outFile) 
{ 
    Int32 dictionary = 1 << 23; 
    Int32 posStateBits = 2; 
    Int32 litContextBits = 3; // for normal files 
    // UInt32 litContextBits = 0; // for 32-bit data 
    Int32 litPosBits = 0; 
    // UInt32 litPosBits = 2; // for 32-bit data 
    Int32 algorithm = 2; 
    Int32 numFastBytes = 128; 

    string mf = "bt4"; 
    bool eos = true; 
    bool stdInMode = false; 


    CoderPropID[] propIDs = { 
     CoderPropID.DictionarySize, 
     CoderPropID.PosStateBits, 
     CoderPropID.LitContextBits, 
     CoderPropID.LitPosBits, 
     CoderPropID.Algorithm, 
     CoderPropID.NumFastBytes, 
     CoderPropID.MatchFinder, 
     CoderPropID.EndMarker 
    }; 

    object[] properties = { 
     (Int32)(dictionary), 
     (Int32)(posStateBits), 
     (Int32)(litContextBits), 
     (Int32)(litPosBits), 
     (Int32)(algorithm), 
     (Int32)(numFastBytes), 
     mf, 
     eos 
    }; 

    using (FileStream inStream = new FileStream(inFile, FileMode.Open)) 
    { 
     using (FileStream outStream = new FileStream(outFile, FileMode.Create)) 
     { 
      SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder(); 
      encoder.SetCoderProperties(propIDs, properties); 
      encoder.WriteCoderProperties(outStream); 
      Int64 fileSize; 
      if (eos || stdInMode) 
       fileSize = -1; 
      else 
       fileSize = inStream.Length; 
      for (int i = 0; i < 8; i++) 
       outStream.WriteByte((Byte)(fileSize >> (8 * i))); 
      encoder.Code(inStream, outStream, -1, -1, null); 
     } 
    } 

} 

public static void DecompressFileLZMA(string inFile, string outFile) 
{ 
    using (FileStream input = new FileStream(inFile, FileMode.Open)) 
    { 
     using (FileStream output = new FileStream(outFile, FileMode.Create)) 
     { 
      SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); 

      byte[] properties = new byte[5]; 
      if (input.Read(properties, 0, 5) != 5) 
       throw (new Exception("input .lzma is too short")); 
      decoder.SetDecoderProperties(properties); 

      long outSize = 0; 
      for (int i = 0; i < 8; i++) 
      { 
       int v = input.ReadByte(); 
       if (v < 0) 
        throw (new Exception("Can't Read 1")); 
       outSize |= ((long)(byte)v) << (8 * i); 
      } 
      long compressedSize = input.Length - input.Position; 

      decoder.Code(input, output, compressedSize, outSize, null); 
     } 
    } 
} 

現在我需要壓縮和解壓多個文件的SDK。
我應該在代碼中更改哪些內容以獲得最佳結果?

回答

0

最後我決定用SevenZipSharp。它具有簡單的壓縮和解壓縮多個文件,單個文件或字節或流的類。

相關問題