C# 压缩文件

7 篇文章 0 订阅
System.IO.Compression 命名空间 注意:此命名空间在 .NET Framework 2.0 版中是新增的。 System.IO.Compression 命名空间包含提供基本的流压缩和解压缩服务的类。 (downmoon原作) 类 说明 DeflateStream 提供用于使用 Deflate 算法压缩和解压缩流的方法和属性。 GZipStream 提供用于压缩和解压缩流的方法和属性。 枚举 说明 CompressionMode 指定是否压缩或解压缩基础流。 下面以 GZipStream 为例说明 注意:此类在 .NET Framework 2.0 版中是新增的。 提供用于压缩和解压缩流的方法和属性。 命名空间:System.IO.Compression 程序集:System(在 system.dll 中) 语法 Visual Basic(声明) Public Class GZipStream Inherits Stream Visual Basic(用法) Dim instance As GZipStream C# public class GZipStream : Stream C++ public ref class GZipStream : public Stream J# public class GZipStream extends Stream JScript public class GZipStream extends Stream 备注 此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。这种格式包括一个检测数据损坏的循环冗余校验值。GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩展以使用其他压缩格式。这种格式可以通过不涉及专利使用权的方式轻松实现。gzip 的格式可以从 RFC 1952“GZIP file format specification 4.3(GZIP 文件格式规范 4.3)GZIP file format specification 4.3(GZIP 文件格式规范 4.3)”中获得。此类不能用于压缩大于 4 GB 的文件。 给继承者的说明 当从 GZipStream 继承时,必须重写下列成员:CanSeek、CanWrite 和 CanRead。 下面提供 一个完整的压缩与解压类(downmoon原作 ): 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 ( ); } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值