c#2.0中新增的两个压缩类(downmoon原创)c#

王朝c#·作者佚名  2007-01-25
窄屏简体版  字體: |||超大  

.NET Framework 2.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);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航