Compression Classes Enhance I/O in .NET 2.0
Sample code to compress a file
FileStream inputFile = null;
GZipStream compressedZipStream = null;
try
{
// Open and read the contents of the file
inputFile = new FileStream("c:\\mylog.txt", FileMode.Open,
FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[inputFile.Length];
int count = inputFile.Read(buffer, 0, buffer.Length);
inputFile.Close();
// Compress the file contents by writing them to a memory stream
MemoryStream memoryBuffer = new MemoryStream();
compressedZipStream = new GZipStream(memoryBuffer,
CompressionMode.Compress, true);
compressedZipStream.Write(buffer, 0, buffer.Length);
compressedZipStream.Close();
Console.WriteLine("Original Size: {0}, Compressed Size: {1}",
buffer.Length, memoryBuffer.Length);
// Pause so we can see the output
Console.ReadLine();
}
finally
{
if (inputFile != null) inputFile.Close();
if (compressedZipStream!= null) compressedZipStream.Close();
}
Figure 1. File Compression
Note: The examples here are all with the GZipStream class, which you could just as easily swap out for the DeflateStream class.
Sample code to decompress a file
The following sample code reads the contents of a file, decompresses it, and then writes it to the console. It relies on the file created in the prior sample:
FileStream inputFile = null;
GZipStream compressedZipStream = null;
try
{
// Determine the uncompressed size of the file;
// we can't rely on the compressed size because
// it's not the true size
inputFile = new FileStream("c:\\mylogcompressed.txt",
FileMode.Open, FileAccess.Read,
FileShare.Read);
compressedZipStream = new GZipStream(inputFile,
CompressionMode.Decompress);
int offset = 0;
int totalBytes = 0;
byte[] smallBuffer = new byte[100];
while (true)
{
int bytesRead = compressedZipStream.Read(smallBuffer, 0, 100);
if (bytesRead == 0)
{
break;
}
offset += bytesRead;
totalBytes += bytesRead;
}
compressedZipStream.Close();
// Open and read the contents of the file now that
// we know the uncompressed size
inputFile = new FileStream("c:\\mylogcompressed.txt",
FileMode.Open, FileAccess.Read,
FileShare.Read);
// Decompress the file contents
compressedZipStream = new GZipStream(inputFile,
CompressionMode.Decompress);
byte[] buffer = new byte[totalBytes];
compressedZipStream.Read(buffer, 0, totalBytes);
// Display the decompression information
Console.WriteLine(System.Text.Encoding.UTF7.GetString(buffer));
Console.WriteLine("Compressed Size: {0}, Decompressed Size: {1}",
inputFile.Length, buffer.Length);
compressedZipStream.Close();
// Pause so we can see the output
Console.ReadLine();
}
finally
{
if (inputFile != null) inputFile.Close();
if (compressedZipStream != null) compressedZipStream.Close();
}
Decompression is more complex because of the way the Read method works. Because the file is compressed, there is no way to know how much data to read. You can approach this in a number of ways. For this sample code, I added code up front to determine the size of the file first. This results in the file being read twice, which is not ideal.
Figure 2. File Decompression
Compression and Decompression Classes
You have received a sneak preview of the compression and decompression classes that are coming in the .NET Framework 2.0, due out later in the year. The simplicity of the examples demonstrates how easy it will be for you to use the functionality within your applications.
No comments:
Post a Comment