2013-01-20 17 views
5

Mam kilka plików .gz i chcę je rozpakować jeden po drugim. Napisałem prosty kod przy użyciu GzipStream w języku C#, ale otrzymałem błąd. Zastanawiam się, poprawny i użyteczny sposób, aby osiągnąć to, co chcę. Wielkie dzięki.rozpakować plik .gz przy użyciu 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

co wyjątków/błędy? –

+0

@ Dan-o Błąd w argumencie "stream" –

Odpowiedz

10

trzeba rozpakować, ale można ustawić CompressionMode.Compress, wymień go CompressionMode.Decompress.

Przykład here.

+1

Tak, masz rację –

1

tutaj:

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