.NET Framework 2.0 中新增的两个压缩类

    技术2022-05-11  97

    .NET Framework 2.0 中新增的两个压缩类(downmoon)

    .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, 04 );                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 ( );            }        }    }

     

     

    最新回复(0)