Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

decompress a .gz file using GZipStream

I have several .gz files, and I want to decompress them one by one. I have writen a simple code using GzipStream in C#, but got failed. I wonder a correct and useful method to achieve what I want. Thanks a lot.

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;
}
like image 409
Jun HU Avatar asked Jan 20 '13 08:01

Jun HU


People also ask

How do I uncompress a GZ file?

To open (unzip) a . gz file, right-click on the file you want to decompress and select “Extract”. Windows users need to install additional software such as 7zip to open . gz files.

How do I unzip a .GZ file in Linux?

You can unzip GZ files in Linux by adding the -d flag to the Gzip/Gunzip command. All the same flags we used above can be applied. The GZ file will be removed by default after we uncompressed it unless we use the -k flag. Below we will unzip the GZ files we compressed in the same directory.

Which command is used to uncompress GZ files?

The gunzip command allows you to decompress . gz files.

How do I open a GZ file without unzip?

Just use zcat to see content without extraction. From the manual: zcat is identical to gunzip -c . (On some systems, zcat may be installed as gzcat to preserve the original link to compress .)


2 Answers

You need to decompress but you set CompressionMode.Compress, replace it with CompressionMode.Decompress.

Example here.

like image 159
Coder Avatar answered Oct 02 '22 03:10

Coder


Here:

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
like image 26
Stefan Steiger Avatar answered Oct 02 '22 03:10

Stefan Steiger