程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .net framework 2.0 中新增的兩個壓縮類及SharpZipLib類

.net framework 2.0 中新增的兩個壓縮類及SharpZipLib類

編輯:.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 );

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

        }
    } 

文章整理:站長天空 網址:http://www.z6688.com/
以上信息與文章正文是不可分割的一部分,如果您要轉載本文章,請保留以上信息,謝謝!
 

/**//// <summary>
 /// FileZipLib 壓縮,解壓縮的類
 /// </summary>
 public class FileZipLib
 ...{
  public FileZipLib() ...{} 
  /**//// <summary>
  /// 創建一個壓縮文件 
  /// </summary>
  /// <param name="zipFilename">壓縮後的文件名</param>
  /// <param name="sourceDirectory">待壓縮文件的所在目錄</param>
  public static voidPackFiles(string zipFilename,string sourceDirectory)
  ...{
   FastZip fz = new FastZip() ;
   fz.CreateEmptyDirectorIEs = true ;
   fz.CreateZip(zipFilename,sourceDirectory,true,"") ;
   fz = null ;
  } 

  /**//// <summary>
  /// 解壓縮文件
  /// </summary>
  /// <param name="zipFile">待解壓縮的文件</param>
  /// <param name="directory">解壓縮後文件存放的目錄</param>
  public static bool UnpackFiles(string zipFile,string directory)
  ...{
   if( !Directory.Exists(directory) )
    Directory.CreateDirectory(directory) ; 

   ZipInputStream zis = new ZipInputStream( File.OpenRead(zipFile) ) ;
   ZipEntry theEntry = null ;
   while( (theEntry = zis.GetNextEntry()) != null )
   ...{
    string directoryName = Path.GetDirectoryName(theEntry.Name) ;
    string fileName = Path.GetFileName(theEntry.Name) ;
    if( directoryName != string.Empty )
     Directory.CreateDirectory(directory + directoryName) ; 

    if( fileName != string.Empty )
    ...{
     FileStream streamWriter = File.Create( Path.Combine( directory,theEntry.Name) ) ;
     int size = 2048 ;
     byte[] data = new byte[size] ;
     while ( true )
     ...{
      size = zis.Read(data,0,data.Length) ;
      if( size > 0 )
       streamWriter.Write( data,0,size ) ;
      else
       break ;
     } 

     streamWriter.Close() ;
    }
   } 

   zis.Close() ;
   return true ;
  }
 }
//最後別忘了using ICSharpCode.SharpZipLib.Zip ;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved