2013-01-20 198 views
5

我有幾個.gz文件,我想逐個解壓縮它們。 我已經寫了一個簡單的代碼在C#中使用GzipStream,但失敗了。我想知道一個正確和有用的方法來實現我想要的。非常感謝。使用GZipStream解壓縮.gz文件

private string Extrgz(string infile) 
{ 
    string dir = Path.GetDirectoryName(infile); 
    string decompressionFileName = dir + Path.GetFileNameWithoutExtension(infile) + "_decompression.bin"; 
    using (GZipStream instream = new GZipStream(File.OpenRead(infile), CompressionMode.Compress))// ArgumentException... 
    { 
     using (FileStream outputStream = new FileStream(decompressionFileName, FileMode.Append, FileAccess.Write)) 
     { 
      int bufferSize = 8192, bytesRead = 0; 
      byte[] buffer = new byte[bufferSize]; 
      while ((bytesRead = instream.Read(buffer, 0, bufferSize)) > 0) 
      { 
       outputStream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 
    return decompressionFileName; 
} 
+0

什麼異常/錯誤? –

+0

@ Dan-o參數「流」錯誤 –

回答

10

你需要解壓,但你設置CompressionMode.Compress,與CompressionMode.Decompress更換。

示例here

+1

是的,你是對的 –

1

這裏:

public static void DeCompressFile(string CompressedFile, string DeCompressedFile) 
{ 
    byte[] buffer = new byte[1024 * 1024]; 

    using (System.IO.FileStream fstrmCompressedFile = System.IO.File.OpenRead(CompressedFile)) // fi.OpenRead()) 
    { 
     using (System.IO.FileStream fstrmDecompressedFile = System.IO.File.Create(DeCompressedFile)) 
     { 
      using (System.IO.Compression.GZipStream strmUncompress = new System.IO.Compression.GZipStream(fstrmCompressedFile, 
        System.IO.Compression.CompressionMode.Decompress)) 
      { 
       int numRead = strmUncompress.Read(buffer, 0, buffer.Length); 

       while (numRead != 0) 
       { 
        fstrmDecompressedFile.Write(buffer, 0, numRead); 
        fstrmDecompressedFile.Flush(); 
        numRead = strmUncompress.Read(buffer, 0, buffer.Length); 
       } // Whend 

       //int numRead = 0; 

       //while ((numRead = strmUncompress.Read(buffer, 0, buffer.Length)) != 0) 
       //{ 
       // fstrmDecompressedFile.Write(buffer, 0, numRead); 
       // fstrmDecompressedFile.Flush(); 
       //} // Whend 

       strmUncompress.Close(); 
      } // End Using System.IO.Compression.GZipStream strmUncompress 

      fstrmDecompressedFile.Flush(); 
      fstrmDecompressedFile.Close(); 
     } // End Using System.IO.FileStream fstrmCompressedFile 

     fstrmCompressedFile.Close(); 
    } // End Using System.IO.FileStream fstrmCompressedFile 

} // End Sub DeCompressFile 


// http://www.dotnetperls.com/decompress 
public static byte[] Decompress(byte[] gzip) 
{ 
    byte[] baRetVal = null; 
    using (System.IO.MemoryStream ByteStream = new System.IO.MemoryStream(gzip)) 
    { 

     // Create a GZIP stream with decompression mode. 
     // ... Then create a buffer and write into while reading from the GZIP stream. 
     using (System.IO.Compression.GZipStream stream = new System.IO.Compression.GZipStream(ByteStream 
      , System.IO.Compression.CompressionMode.Decompress)) 
     { 
      const int size = 4096; 
      byte[] buffer = new byte[size]; 
      using (System.IO.MemoryStream memory = new System.IO.MemoryStream()) 
      { 
       int count = 0; 
       count = stream.Read(buffer, 0, size); 
       while (count > 0) 
       { 
        memory.Write(buffer, 0, count); 
        memory.Flush(); 
        count = stream.Read(buffer, 0, size); 
       } 

       baRetVal = memory.ToArray(); 
       memory.Close(); 
      } 

      stream.Close(); 
     } // End Using System.IO.Compression.GZipStream stream 

     ByteStream.Close(); 
    } // End Using System.IO.MemoryStream ByteStream 

    return baRetVal; 
} // End Sub Decompress