C# 用 SharpZipLib 压缩解压文件夹

//在 http://www.icsharpcode.net/ 下载SharpZipLib.dll
//首先需要在项目里引用SharpZipLib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:
///   <summary> 
  ///   压缩文件 
  ///   </summary> 

using   System; 
using   System.IO; 

using   ICSharpCode.SharpZipLib.Checksums; 
using   ICSharpCode.SharpZipLib.Zip; 
using   ICSharpCode.SharpZipLib.GZip; 

namespace   Compression 
{ 
  public   class   ZipClass 
  { 
  
    public   void   ZipFile(string   FileToZip,   string   ZipedFile   ,int   CompressionLevel,   int   BlockSize) 
    { 
      //如果文件没有找到,则报错 
      if   (!   System.IO.File.Exists(FileToZip))   
      { 
        throw   new   System.IO.FileNotFoundException( "The   specified   file   "   +   FileToZip   +   "   could   not   be   found.   Zipping   aborderd "); 
      } 
    
      System.IO.FileStream   StreamToZip   =   new   System.IO.FileStream(FileToZip,System.IO.FileMode.Open   ,   System.IO.FileAccess.Read); 
      System.IO.FileStream   ZipFile   =   System.IO.File.Create(ZipedFile); 
      ZipOutputStream   ZipStream   =   new   ZipOutputStream(ZipFile); 
      ZipEntry   ZipEntry   =   new   ZipEntry( "ZippedFile "); 
      ZipStream.PutNextEntry(ZipEntry); 
      ZipStream.SetLevel(CompressionLevel); 
      byte[]   buffer   =   new   byte[BlockSize]; 
      System.Int32   size   =StreamToZip.Read(buffer,0,buffer.Length); 
      ZipStream.Write(buffer,0,size); 
      try   
      { 
        while   (size   <   StreamToZip.Length)   
        { 
          int   sizeRead   =StreamToZip.Read(buffer,0,buffer.Length); 
          ZipStream.Write(buffer,0,sizeRead); 
          size   +=   sizeRead; 
        } 
      }   
      catch(System.Exception   ex) 
      { 
        throw   ex; 
      } 
      ZipStream.Finish(); 
      ZipStream.Close(); 
      StreamToZip.Close(); 
    } 
  
    public   void   ZipFileMain(string[]   args) 
    { 
      string[]   filenames   =   Directory.GetFiles(args[0]); 
    
      Crc32   crc   =   new   Crc32(); 
      ZipOutputStream   s   =   new   ZipOutputStream(File.Create(args[1])); 
    
      s.SetLevel(6);   //   0   -   store   only   to   9   -   means   best   compression 
    
      foreach   (string   file   in   filenames)   
      { 
        //打开压缩文件 
        FileStream   fs   =   File.OpenRead(file); 
      
        byte[]   buffer   =   new   byte[fs.Length]; 
        fs.Read(buffer,   0,   buffer.Length); 
        ZipEntry   entry   =   new   ZipEntry(file); 
      
        entry.DateTime   =   DateTime.Now; 
      
        //   set   Size   and   the   crc,   because   the   information 
        //   about   the   size   and   crc   should   be   stored   in   the   header 
        //   if   it   is   not   set   it   is   automatically   written   in   the   footer. 
        //   (in   this   case   size   ==   crc   ==   -1   in   the   header) 
        //   Some   ZIP   programs   have   problems   with   zip   files   that   don 't   store 
        //   the   size   and   crc   in   the   header. 
        entry.Size   =   fs.Length; 
        fs.Close(); 
      
        crc.Reset(); 
        crc.Update(buffer); 
      
        entry.Crc     =   crc.Value; 
      
        s.PutNextEntry(entry); 
      
        s.Write(buffer,   0,   buffer.Length); 
      
      } 
    
      s.Finish(); 
      s.Close(); 
    } 
  } 
} 

//现在再来看看解压文件类的源码 

  ///   <summary> 
  ///   解压文件 
  ///   </summary> 

using   System; 
using   System.Text; 
using   System.Collections; 
using   System.IO; 
using   System.Diagnostics; 
using   System.Runtime.Serialization.Formatters.Binary; 
using   System.Data; 

using   ICSharpCode.SharpZipLib.BZip2; 
using   ICSharpCode.SharpZipLib.Zip; 
using   ICSharpCode.SharpZipLib.Zip.Compression; 
using   ICSharpCode.SharpZipLib.Zip.Compression.Streams; 
using   ICSharpCode.SharpZipLib.GZip; 

namespace   DeCompression 
{ 
  public   class   UnZipClass 
  {       
    public   void   UnZip(string[]   args) 
    { 
      ZipInputStream   s   =   new   ZipInputStream(File.OpenRead(args[0])); 
    
      ZipEntry   theEntry; 
      while   ((theEntry   =   s.GetNextEntry())   !=   null)   
      { 
      
                    string   directoryName   =   Path.GetDirectoryName(args[1]); 
        string   fileName             =   Path.GetFileName(theEntry.Name); 
      
        //生成解压目录 
        Directory.CreateDirectory(directoryName); 
      
        if   (fileName   !=   String.Empty)   
        {       
          //解压文件到指定的目录 
          FileStream   streamWriter   =   File.Create(args[1]+theEntry.Name); 
        
          int   size   =   2048; 
          byte[]   data   =   new   byte[2048]; 
          while   (true)   
          { 
            size   =   s.Read(data,   0,   data.Length); 
            if   (size   >   0)   
            { 
              streamWriter.Write(data,   0,   size); 
            }   
            else   
            { 
              break; 
            } 
          } 
        
          streamWriter.Close(); 
        } 
      } 
      s.Close(); 
    } 
  } 
} 

///   <summary> 
  ///   调用源码 
  ///   </summary> 

            private   void   button2_Click_1(object   sender,   System.EventArgs   e) 
    { 
      string   []FileProperties=new   string[2]; 
      FileProperties[0]= "C:\unzipped\ ";//待压缩文件目录 
      FileProperties[1]= "C:\zip\a.zip ";     //压缩后的目标文件 
      ZipClass   Zc=new   ZipClass(); 
      Zc.ZipFileMain(FileProperties); 
    } 

          private   void   button2_Click(object   sender,   System.EventArgs   e) 
    { 
      string   []FileProperties=new   string[2]; 
      FileProperties[0]= "C:\zip\test.zip ";//待解压的文件 
      FileProperties[1]= "C:\unzipped\ ";//解压后放置的目标目录 
      UnZipClass   UnZc=new   UnZipClass(); 
      UnZc.UnZip(FileProperties); 
    } 

 

来自网络

 

posted @ 2010-06-17 12:52  M'  阅读(1460)  评论(0编辑  收藏  举报