c#2.0中新增的两个压缩类(downmoon原创)c# - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- c#2.0中新增的两个压缩类(downmoon原创)c# (http://www.webasp.net/article/29/28145.htm) |
| -- 作者:邀月 -- 发布日期: 2007-01-25 |
.NET Framework 2.0 中新增的两个压缩类 class clsZip![]() ...{ public void CompressFile ( string sourceFile, string destinationFile )![]() ...{ // make sure the source file is there if ( File.Exists ( sourceFile ) == false ) throw new FileNotFoundException ( );![]() // Create the streams and byte arrays needed 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 to 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, "压缩文件时发生错误:", MessageBoxButtons.OK, MessageBoxIcon.Error ); } finally![]() ...{ // Make sure we allways close all streams if ( sourceStream != null ) sourceStream.Close ( );![]() if ( compressedStream != null ) compressedStream.Close ( );![]() if ( destinationStream != null ) destinationStream.Close ( ); } }![]() public void DecompressFile ( string sourceFile, string destinationFile )![]() ...{ // make sure the source file is there 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 everything to the destination file destinationStream = new FileStream ( destinationFile, FileMode.Create ); destinationStream.Write ( buffer, 0, total );![]() // and flush everyhting to clean out the buffer destinationStream.Flush ( ); } catch ( ApplicationException ex )![]() ...{ MessageBox.Show(ex.Message, "解压文件时发生错误:", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally![]() ...{ // Make sure we allways close all streams if ( sourceStream != null ) sourceStream.Close ( );![]() if ( decompressedStream != null ) decompressedStream.Close ( );![]() if ( destinationStream != null ) destinationStream.Close ( ); }![]() } } |
| webasp.net |