John Sheehan
John Sheehan

Reputation: 78152

How do you download and extract a gzipped file with C#?

I need to periodically download, extract and save the contents of http://data.dot.state.mn.us/dds/det_sample.xml.gz to disk. Anyone have experience downloading gzipped files with C#?

Upvotes: 23

Views: 24713

Answers (6)

Ajai Rajendran
Ajai Rajendran

Reputation: 1

You can use the HttpContext object to download a csv.gz file

Convert you DataTable into string using StringBuilder (inputString)

byte[] buffer = Encoding.ASCII.GetBytes(inputString.ToString());
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.csv.gz", fileName));
HttpContext.Current.Response.Filter = new GZipStream(HttpContext.Current.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip");
using (GZipStream zipStream = new GZipStream(HttpContext.Current.Response.OutputStream, CompressionMode.Compress))
{
    zipStream.Write(buffer, 0, buffer.Length);
}
HttpContext.Current.Response.End();

You can extract this downloaded file using 7Zip

Upvotes: 0

JeremiahClark
JeremiahClark

Reputation: 5387

To compress:

using (FileStream fStream = new FileStream(@"C:\test.docx.gzip", 
FileMode.Create, FileAccess.Write)) {
    using (GZipStream zipStream = new GZipStream(fStream, 
    CompressionMode.Compress)) {
        byte[] inputfile = File.ReadAllBytes(@"c:\test.docx");
        zipStream.Write(inputfile, 0, inputfile.Length);
    }
}

To Decompress:

using (FileStream fInStream = new FileStream(@"c:\test.docx.gz", 
FileMode.Open, FileAccess.Read)) {
    using (GZipStream zipStream = new GZipStream(fInStream, CompressionMode.Decompress)) {   
        using (FileStream fOutStream = new FileStream(@"c:\test1.docx", 
        FileMode.Create, FileAccess.Write)) {
            byte[] tempBytes = new byte[4096];
            int i;
            while ((i = zipStream.Read(tempBytes, 0, tempBytes.Length)) != 0) {
                fOutStream.Write(tempBytes, 0, i);
            }
        }
    }
}

Taken from a post I wrote last year that shows how to decompress a gzip file using C# and the built-in GZipStream class. http://blogs.msdn.com/miah/archive/2007/09/05/zipping-files.aspx

As for downloading it, you can use the standard WebRequest or WebClient classes in .NET.

Upvotes: 29

Yaakov Ellis
Yaakov Ellis

Reputation: 41550

Try the SharpZipLib, a C# based library for compressing and uncompressing files using gzip/zip.

Sample usage can be found on this blog post:

using ICSharpCode.SharpZipLib.Zip;

FastZip fz = new FastZip();       
fz.ExtractZip(zipFile, targetDirectory,"");

Upvotes: 5

Adam Haile
Adam Haile

Reputation: 31359

You can use WebClient in System.Net to download:

WebClient Client = new WebClient ();
Client.DownloadFile("http://data.dot.state.mn.us/dds/det_sample.xml.gz", " C:\mygzipfile.gz");

then use #ziplib to extract

Edit: or GZipStream... forgot about that one

Upvotes: 7

Dale Ragan
Dale Ragan

Reputation: 18270

Just use the HttpWebRequest class in the System.Net namespace to request the file and download it. Then use GZipStream class in the System.IO.Compression namespace to extract the contents to the location you specify. They provide examples.

Upvotes: 4

Patrick
Patrick

Reputation: 92600

The GZipStream class might be what you want.

Upvotes: 2

Related Questions