Frage

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;
}
War es hilfreich?

Lösung

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

Example here.

Andere Tipps

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top