Compressing and Decompressing files in C#

File compression and decompression in C# is accomplished using the System.IO.Compression namespace. This namespace provides classes like GZipStream and ZipArchive for handling compressed files efficiently.

Syntax

Following is the syntax for compressing files using GZipStream

using (var compressStream = new GZipStream(outputStream, CompressionMode.Compress)) {
    // write data to compress
}

Following is the syntax for decompressing files using GZipStream

using (var decompressStream = new GZipStream(inputStream, CompressionMode.Decompress)) {
    // read decompressed data
}

Using GZipStream for File Compression

To compress a file, use the GZipStream class with FileStream. The compressed data is written to an output stream while reading from the source file −

Example

using System;
using System.IO;
using System.IO.Compression;

class Program {
    public static void Main() {
        string sourceFile = "sample.txt";
        string compressedFile = "sample.gz";
        
        // Create a sample file first
        File.WriteAllText(sourceFile, "This is sample text content for compression testing. " +
                          "The more text we have, the better we can see the compression effect.");
        
        // Compress the file
        using (FileStream inFile = new FileStream(sourceFile, FileMode.Open))
        using (FileStream outputFile = new FileStream(compressedFile, FileMode.Create))
        using (var compress = new GZipStream(outputFile, CompressionMode.Compress)) {
            inFile.CopyTo(compress);
        }
        
        Console.WriteLine("File compressed successfully!");
        Console.WriteLine($"Original size: {new FileInfo(sourceFile).Length} bytes");
        Console.WriteLine($"Compressed size: {new FileInfo(compressedFile).Length} bytes");
    }
}

The output of the above code is −

File compressed successfully!
Original size: 113 bytes
Compressed size: 93 bytes

Using GZipStream for File Decompression

To decompress a file, open the compressed file with GZipStream in CompressionMode.Decompress mode and copy the content to the output file −

Example

using System;
using System.IO;
using System.IO.Compression;

class Program {
    public static void Main() {
        string compressedFile = "sample.gz";
        string decompressedFile = "sample_restored.txt";
        
        // Create a compressed file first for demonstration
        string originalContent = "This is sample text content for decompression testing.";
        using (FileStream outputFile = new FileStream(compressedFile, FileMode.Create))
        using (var compress = new GZipStream(outputFile, CompressionMode.Compress)) {
            byte[] data = System.Text.Encoding.UTF8.GetBytes(originalContent);
            compress.Write(data, 0, data.Length);
        }
        
        // Decompress the file
        using (FileStream inputStream = new FileStream(compressedFile, FileMode.Open))
        using (var zip = new GZipStream(inputStream, CompressionMode.Decompress))
        using (FileStream outputStream = new FileStream(decompressedFile, FileMode.Create)) {
            zip.CopyTo(outputStream);
        }
        
        Console.WriteLine("File decompressed successfully!");
        Console.WriteLine($"Decompressed content: {File.ReadAllText(decompressedFile)}");
    }
}

The output of the above code is −

File decompressed successfully!
Decompressed content: This is sample text content for decompression testing.

Using ZipArchive for Multiple Files

For handling multiple files in a single archive, use the ZipArchive class which provides more advanced features −

Example

using System;
using System.IO;
using System.IO.Compression;

class Program {
    public static void Main() {
        string zipPath = "archive.zip";
        
        // Create a zip archive with multiple files
        using (var archive = ZipFile.Open(zipPath, ZipArchiveMode.Create)) {
            // Add first file
            var entry1 = archive.CreateEntry("file1.txt");
            using (var stream = entry1.Open()) {
                byte[] data = System.Text.Encoding.UTF8.GetBytes("Content of file 1");
                stream.Write(data, 0, data.Length);
            }
            
            // Add second file
            var entry2 = archive.CreateEntry("file2.txt");
            using (var stream = entry2.Open()) {
                byte[] data = System.Text.Encoding.UTF8.GetBytes("Content of file 2");
                stream.Write(data, 0, data.Length);
            }
        }
        
        Console.WriteLine("Zip archive created with multiple files!");
        
        // Extract and display contents
        using (var archive = ZipFile.OpenRead(zipPath)) {
            foreach (var entry in archive.Entries) {
                using (var stream = entry.Open())
                using (var reader = new StreamReader(stream)) {
                    Console.WriteLine($"{entry.FullName}: {reader.ReadToEnd()}");
                }
            }
        }
    }
}

The output of the above code is −

Zip archive created with multiple files!
file1.txt: Content of file 1
file2.txt: Content of file 2

Comparison of Compression Methods

Method Use Case Features
GZipStream Single file compression Good compression ratio, fast
ZipArchive Multiple files in one archive Directory structure support, metadata
DeflateStream Raw compression without headers Smallest overhead, custom formats

Conclusion

C# provides robust compression capabilities through the System.IO.Compression namespace. Use GZipStream for single file compression with good compression ratios, and ZipArchive for handling multiple files in organized archives with full directory structure support.

Updated on: 2026-03-17T07:04:35+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements