Compressing and DeCompressing a File in C#


By Cosmos Mysore
Printer Friendly Version
View My Articles
10 Points

Methods to compress file and decompress file using System.IO.Compression



Method to compress a file.

public void CompressFile ( string sourceFile, string destinationFile )

{

// Check File exists in the source path

if ( File.Exists ( sourceFile ) == false )

throw new FileNotFoundException ( );

// Create the streams and byte arrays

byte[] buffer = null;

FileStream sourceStream = null;

FileStream destinationStream = null;

GZipStream compressedStream = null;

try

{

// Read the bytes from the source file into a byte array

sourceStream = new FileStream ( sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read );

// Read the source stream values into the buffer

buffer = new byte[sourceStream.Length];

int checkCounter = sourceStream.Read ( buffer, 0, buffer.Length );

if ( checkCounter != buffer.Length )

{

throw new ApplicationException ( );

}

// Open the FileStream to write

destinationStream = new FileStream ( destinationFile, FileMode.OpenOrCreate, FileAccess.Write );

// Create a compression stream pointing to the destiantion stream

compressedStream = new GZipStream ( destinationStream, CompressionMode.Compress, true );

// Now write the compressed data to the destination file

compressedStream.Write ( buffer, 0, buffer.Length );

}

catch ( ApplicationException ex )

{

MessageBox.Show ( ex.Message, "Error occured during compression", MessageBoxButtons.OK, MessageBoxIcon.Error );

}

finally

{

// Close all streams

if ( sourceStream != null )

sourceStream.Close ( );

if ( compressedStream != null )

compressedStream.Close ( );

if ( destinationStream != null )

destinationStream.Close ( );

}

}


Method to DeCompress a file.


public void DecompressFile ( string sourceFile, string destinationFile )

{

// Check File exists in the source path

if ( File.Exists ( sourceFile ) == false )

throw new FileNotFoundException ( );

// Create the streams and byte arrays needed

FileStream sourceStream = null;

FileStream destinationStream = null;

GZipStream decompressedStream = null;

byte[] quartetBuffer = null;

try

{

// Read in the compressed source stream

sourceStream = new FileStream ( sourceFile, FileMode.Open );

// Create a compression stream pointing to the destiantion stream

decompressedStream = new GZipStream ( sourceStream, CompressionMode.Decompress, true );

// Read the footer to determine the length of the destiantion file

quartetBuffer = new byte[4];

int position = (int)sourceStream.Length - 4;

sourceStream.Position = position;

sourceStream.Read ( quartetBuffer, 0, 4 );

sourceStream.Position = 0;

int checkLength = BitConverter.ToInt32 ( quartetBuffer, 0 );

byte[] buffer = new byte[checkLength + 100];

int offset = 0;

int total = 0;

// Read the compressed data into the buffer

while ( true )

{

int bytesRead = decompressedStream.Read ( buffer, offset, 100 );

if ( bytesRead == 0 )

break;

offset += bytesRead;

total += bytesRead;

}

// Now write to the destination file

destinationStream = new FileStream ( destinationFile, FileMode.Create );

destinationStream.Write ( buffer, 0, total );

// Flush to clean out the buffer

destinationStream.Flush ( );

}

catch ( ApplicationException ex )

{

MessageBox.Show ( ex.Message, "An Error occured during compression", MessageBoxButtons.OK, MessageBoxIcon.Error );

}

finally

{

// Close all streams

if ( sourceStream != null )

sourceStream.Close ( );

if ( decompressedStream != null )

decompressedStream.Close ( );

if ( destinationStream != null )

destinationStream.Close ( );

}

}

'기본 카테고리' 카테고리의 다른 글

m480  (0) 2009.02.19
MySQL 날짜 시간 함수  (0) 2009.02.18
Writing an ActiveX control in C#  (0) 2009.02.17
ClickOnce Deployment Limitations  (0) 2009.02.09
우분투 넷북 리믹스(Netbook remix)  (0) 2009.02.02

+ Recent posts