How to: Compress Files

Use the System.IO.Compression.GZipStream class to compress and decompress data. You can also use the System.IO.Compression.DeflateStream class, which uses the same compression algorithm; however, compressed GZipStream objects written to a file that has an extension of .gz can be decompressed using many common compression tools.

This example shows how to compress and decompress a directory of files by using the GZipStream class.

Example

Imports System.IO
Imports System.IO.Compression
Module Module1

    Sub Main()
        ' Path to directory of files to compress. 
        Dim dirpath As String = "c:\users\public\reports" 

        Dim di As DirectoryInfo = New DirectoryInfo(dirpath)


        ' Compress the directory's files. 
        For Each fi As FileInfo In di.GetFiles()
            Compress(fi)
        Next 

        ' Decompress all *.gz files in the directory. 
        For Each fi As FileInfo In di.GetFiles("*.gz")
            Decompress(fi)
        Next 

    End Sub 

    ' Method to compress. 
    Private Sub Compress(ByVal fi As FileInfo)
        ' Get the stream of the source file. 
        Using inFile As FileStream = fi.OpenRead()
            ' Compressing: 
            ' Prevent compressing hidden and already compressed files. 

            If (File.GetAttributes(fi.FullName) And FileAttributes.Hidden) _
                <> FileAttributes.Hidden And fi.Extension <> ".gz" Then 
                ' Create the compressed file. 
                Using outFile As FileStream = File.Create(fi.FullName + ".gz")
                    Using Compress As GZipStream = New GZipStream(outFile, CompressionMode.Compress)
                        ' Copy the source file into the compression stream. 
                        Dim buffer As Byte() = New Byte(4096) {}
                        Dim numRead As Integer
                        numRead = inFile.Read(buffer, 0, buffer.Length)
                        Do While numRead <> 0
                            Compress.Write(buffer, 0, numRead)
                            numRead = inFile.Read(buffer, 0, buffer.Length)
                        Loop

                        Console.WriteLine("Compressed {0} from {1} to {2} bytes.", _
                                          fi.Name, fi.Length.ToString(), outFile.Length.ToString())

                    End Using 
                End Using 
            End If 
        End Using 
    End Sub 

    ' Method to decompress. 
    Private Sub Decompress(ByVal fi As FileInfo)
        ' Get the stream of the source file. 
        Using inFile As FileStream = fi.OpenRead()
            ' Get orignial file extension, for example "doc" from report.doc.gz. 
            Dim curFile As String = fi.FullName
            Dim origName = curFile.Remove(curFile.Length - fi.Extension.Length)

            ' Create the decompressed file. 
            Using outFile As FileStream = File.Create(origName)
                Using Decompress As GZipStream = New GZipStream(inFile, CompressionMode.Decompress)
                    ' Copy the compressed file into the decompression stream. 
                    Dim buffer As Byte() = New Byte(4096) {}
                    Dim numRead As Integer
                    numRead = Decompress.Read(buffer, 0, buffer.Length)
                    Do While numRead <> 0
                        outFile.Write(buffer, 0, numRead)
                        numRead = Decompress.Read(buffer, 0, buffer.Length)
                    Loop
                    Console.WriteLine("Decompressed: {0}", fi.Name)

                End Using 
            End Using 
        End Using 
    End Sub 
End Module
using System;
using System.IO;
using System.IO.Compression;

namespace zip
{

    public class Program
    {

        public static void Main()
        {
            // Path to directory of files to compress and decompress. 
            string dirpath = @"c:\users\public\reports";

            DirectoryInfo di = new DirectoryInfo(dirpath);

            // Compress the directory's files. 
            foreach (FileInfo fi in di.GetFiles())
            {
                Compress(fi);

            }

            // Decompress all *.gz files in the directory. 
            foreach (FileInfo fi in di.GetFiles("*.gz"))
            {
                Decompress(fi);

            }


        }

        public static void Compress(FileInfo fi)
        {
            // Get the stream of the source file. 
            using (FileStream inFile = fi.OpenRead())
            {
                // Prevent compressing hidden and already compressed files. 
                if ((File.GetAttributes(fi.FullName) & FileAttributes.Hidden)
                        != FileAttributes.Hidden & fi.Extension != ".gz")
                {
                    // Create the compressed file. 
                    using (FileStream outFile = File.Create(fi.FullName + ".gz"))
                    {
                        using (GZipStream Compress = new GZipStream(outFile,
                                CompressionMode.Compress))
                        {
                            // Copy the source file into the compression stream. 
                            byte[] buffer = new byte[4096];
                            int numRead;
                            while ((numRead = inFile.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                Compress.Write(buffer, 0, numRead);
                            }
                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                        }
                    }
                }
            }
        }

        public static void Decompress(FileInfo fi)
        {
            // Get the stream of the source file. 
            using (FileStream inFile = fi.OpenRead())
            {
                // Get original file extension, for example "doc" from report.doc.gz.
                string curFile = fi.FullName;
                string origName = curFile.Remove(curFile.Length - fi.Extension.Length);

                //Create the decompressed file. 
                using (FileStream outFile = File.Create(origName))
                {
                    using (GZipStream Decompress = new GZipStream(inFile,
                            CompressionMode.Decompress))
                    {
                        //Copy the decompression stream into the output file. 
                        byte[] buffer = new byte[4096];
                        int numRead;
                        while ((numRead = Decompress.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            outFile.Write(buffer, 0, numRead);
                        }
                        Console.WriteLine("Decompressed: {0}", fi.Name);

                    }
                }
            }
        }

    }
}

See Also

Reference

GZipStream

DeflateStream

Change History

Date

History

Reason

August 2009

Improved the code example.

Information enhancement.