How to compress and decompress files in C#
Files are useful for applications to communicate with others. For instance, web applications can communicate with Google's crawlers via sitemaps on the Internet. A web application write urls to its pages to its sitemap. When Google's crawlers come to this web applications, they will download these sitemaps to index urls to the pages of .
To reduce the time needed for files to be trasmitted over the network, it is a good idea for applications to compress files before sending them out to the network, or for a web application, making them available for download via HTTP.
In this post, I document how we can compress and decompress files via the GZip implementation in C# - System.IO.Compression.GZipStream.
GZipStream is a wrapper which wraps around other derivatives of the System.IO.Stream to provide for data compression and decompression. It runs in one of two modes which is specified by one of System.IO.Compression.CompressionMode enumeration members:
CompressionMode.Compress- Configures theGZipStreaminstance to compress data. When aGZipStreaminstance is being configured to compress data, we will read from a file and write the contents of the file to the GZipStream instance.CompressionMode.Decompress- Configures theGZipStreaminstance to decompress data. When aGZipStreaminstance is being configured to decompress data, we will read data from it and write the data to another file.
Compressing a file using GZipStream
FileStream sourceFileStream = File.OpenRead("sitemap.xml");
FileStream destFileStream = File.Create("sitemap.xml.gz");
GZipStream compressingStream = new GZipStream(destFileStream,
CompressionMode.Compress);
byte[] bytes = new byte[2048];
int bytesRead;
while ((bytesRead = sourceFileStream.Read(bytes, 0, bytes.Length)) != 0)
{
compressingStream.Write(bytes, 0, bytesRead);
}
sourceFileStream.Close();
compressingStream.Close();
destFileStream.Close();
The code segment begins by first gaining read access to sitemap.xml, via sourceFileStream, which we are going to compress. After that, we gain write access to sitemap.xml.gz, via destFileStream, which we are going to have our GZipStream instance write the compressed data into.
When we had gained access to the relevant files, we create a GZipStream instance by passing in destFileStream and the CompressionMode.Compress enumeration option into one of its constructors. We set this instance to compressingStream.
Once we have the necessary Stream objects, we begin to compress sitemap.xml. To do that, we simply read from sourceFileStream and write its contents to compressingStream. Note that we are writing 2048 bytes at a time to compressingStream instead of writing byte by byte. This is because if we write byte by byte to compressingStream, our GZipStream instance won't be able to compress our file well.
When we are done with compressing sitemap.xml, we relinquish accesses to sourceFileStream, destFileStream and compressingStream.
Decompressing a file using GZipStream
FileStream sourceFileStream = File.OpenRead("sitemap.xml.gz");
FileStream destFileStream = File.Create("sitemap.xml");
GZipStream decompressingStream = new GZipStream(sourceFileStream,
CompressionMode.Decompress);
int byteRead;
while((byteRead = decompressingStream.ReadByte()) != -1)
{
destFileStream.WriteByte((byte)byteRead);
}
decompressingStream.Close();
sourceFileStream.Close();
destFileStream.Close();
The code segment begins by first gaining code access to sitemap.xml.gz, via sourceFileStream, which we are going to decompress. After that, we gain write access to sitemap.xml, via destFileStream, which we are going to write decompressed data read from our GZipStream instance.
When we had gained code access to the relevant files, we create a GZipStream instance, passing sourceFileStream and the CompressionMode.Decompress enumeration option into one of its constructors. We set this instance to decompressingStream.
Once we have the necessary Stream objects, we begin to decompress sitemap.xml.gz. To do that, we simply read from decompressingStream and write its contents to destFileStream.
When we are done with decompressing sitemap.xml.gz, we relinquish accesses to decompressingStream, sourceFileStream and destFileStream.
4 Comments
Thank you very much for this code. I search all google but i didn’t find this simple code. Keep it up and god with you. Again thank you for this great stuffs.
Hi Kalu,
Thank you for dropping by, glad you had found this code useful. 🙂
Thanks Clivant. This code was useful to me. Clear and to the point.
Hi jmlaks, thanks for dropping by and glad that the code was useful to you.