用SharpZipLib来压缩和解压文件

1.建立工程,添加引用,添加SharpZipLib.dll
2.建立压缩和解压类CompressionFile.cs
添加如下代码
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebApplication3
{
    
ZipClass 压缩文件 ZipClass 压缩文件
    
public class ZipClass
    
{
        
public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize,string password)
        
{
            
//如果文件没有找到,则报错
            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]);
            string[] filenames = new string[]{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();
        }

    }

    
#endregion


    
UnZipClass 解压文件 UnZipClass 解压文件
    
public class UnZipClass
    
{   
        
/// <summary>
        
/// 解压文件
        
/// </summary>
        
/// <param name="args">包含要解压的文件名和要解压到的目录名数组</param>

        public void UnZip(string[] args)
        
{
            ZipInputStream s 
= new ZipInputStream(File.OpenRead(args[0]));
            
try
            
{                
                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]+fileName);
    
                        
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();
            }

            
catch(Exception eu)
            
{
                
throw eu;
            }

            
finally
            
{
                s.Close();
            }


        }
//end UnZip


    }
//end UnZipClass
    #endregion

    
AttachmentUnZip AttachmentUnZip
    
public class AttachmentUnZip
    
{
        
public AttachmentUnZip()
        
{            
        }

        
public static void UpZip(string zipFile)
        
{
            
string []FileProperties=new string[2];

            FileProperties[
0]=zipFile;//待解压的文件

            FileProperties[
1]=zipFile.Substring(0,zipFile.LastIndexOf("""")+1);//解压后放置的目标目录

            UnZipClass UnZc
=new UnZipClass();

            UnZc.UnZip(FileProperties);
        }


    }

    
#endregion
}
3.建立测试页面
3.1html
<HTML>
    
<HEAD>
        
<title>WebForm1</title>
        
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        
<meta name="CODE_LANGUAGE" Content="C#">
        
<meta name="vs_defaultClientScript" content="JavaScript">
        
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    
</HEAD>
    
<body MS_POSITIONING="GridLayout">
        
<form id="Form1" method="post" runat="server">
            
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server"
                Text
="压缩"></asp:Button>
            
<asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 112px; POSITION: absolute; TOP: 64px" runat="server"
                Text
="解压"></asp:Button><INPUT id="File1" style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 24px" type="file"
                name
="File1" runat="server">
        
</form>
    
</body>
</HTML>
3.2 cs代码
public class WebForm1 : System.Web.UI.Page
    
{
        
protected System.Web.UI.WebControls.Button Button1;
        
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
        
protected System.Web.UI.WebControls.Button Button2;
    
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// Put user code to initialize the page here
        }



        
Web Form Designer generated code Web Form Designer generated code
        
override protected void OnInit(EventArgs e)
        
{
            
//
            
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
            
//
            InitializeComponent();
            
base.OnInit(e);
        }

        
        
/// <summary>
        
/// Required method for Designer support - do not modify
        
/// the contents of this method with the code editor.
        
/// </summary>

        private void InitializeComponent()
        
{    
            
this.Button1.Click += new System.EventHandler(this.Button1_Click);
            
this.Button2.Click += new System.EventHandler(this.Button2_Click);
            
this.Load += new System.EventHandler(this.Page_Load);

        }

        
#endregion


        
压缩 压缩
        
private void Button1_Click(object sender, System.EventArgs e)
        
{
            
string []FileProperties=new string[2];            
            
string fullName=this.File1.PostedFile.FileName;//C:"test"a.txt
            string destPath=System.IO.Path.GetDirectoryName(fullName);//C:"test
            
//待压缩文件
            FileProperties[0]=fullName;

            
//压缩后的目标文件
            FileProperties[1]= destPath +""""+ System.IO.Path.GetFileNameWithoutExtension(fullName)+".zip";
            ZipClass Zc
=new ZipClass();
            Zc.ZipFileMain(FileProperties);

            
//删除压缩前的文件
            System.IO.File.Delete(fullName);
        }


        
#endregion

        
解压 解压
        
private void Button2_Click(object sender, System.EventArgs e)
        
{
            
string fullName=this.File1.PostedFile.FileName;//C:"test"a.zip
            
//解压文件
            AttachmentUnZip.UpZip(fullName);
        }

        
#endregion

    }

源码下载/Files/gllgsoft/zipunzip.rar

posted @ 2008-08-29 14:34  gllg  阅读(268)  评论(0编辑  收藏  举报