现在的位置: 首页 > 综合 > 正文

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

2013年02月06日 ⁄ 综合 ⁄ 共 5762字 ⁄ 字号 评论关闭

.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);

            }




            

finally


            


{

                

//
 Make sure we allways close all streams


                
if
 ( sourceStream 
!=
 
null
 )

                    sourceStream.Close ( );


                

if
 ( decompressedStream 
!=
 
null
 )

                    decompressedStream.Close ( );


                

if
 ( destinationStream 
!=
 
null
 )

                    destinationStream.Close ( );

            }





        }




    }

抱歉!评论已关闭.