• C# 压缩文件 dodo


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


            }

        }
  • 相关阅读:
    FFmpegTool 这个是很早以前写得ffmpeg c99部分转C89工具代码
    mmsplayer V2 for IOS 完成. V2 所有汇总
    关于mmsplayer一些电台不支持播放问题说明
    libmpg123 解码库用法
    [置顶] mmsplayer V2 for IOS 完成. V2 所有汇总
    使用lipo合并iPhone模拟器和真机的静态类库
    vbs编程
    Adobe reader查阅PDF文件无法显示中文
    常去的下载网站
    .Net程序设计快速入门——分页设计篇
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1298905.html
Copyright © 2020-2023  润新知