2013-01-20 35 views
5

Tôi có một vài tệp .gz và tôi muốn giải nén từng tệp một. Tôi đã viết một đoạn mã đơn giản bằng GzipStream trong C#, nhưng đã thất bại. Tôi tự hỏi một phương pháp chính xác và hữu ích để đạt được những gì tôi muốn. Cảm ơn rất nhiều.giải nén tệp .gz bằng GZipStream

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

gì ngoại lệ/lỗi? –

+0

@ Dan-o Lỗi trong đối số "luồng" –

Trả lời

10

Bạn cần phải giải nén nhưng bạn thiết CompressionMode.Compress, thay thế nó với CompressionMode.Decompress.

Ví dụ here.

+1

Có, bạn đúng –

1

đây:

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