Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
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.
