.net 压缩文件 SharpZipLib压缩

今天的任务就是将用户选择的文件进行压缩     以前没弄过      所以从网上找了一些资料     资料上说微软提供了压缩的类库  不过只能压缩一份文件    如果要进行多份压缩的话  必须要用到外部的类库了   今天介绍的就是SharpZipLib压缩   资料来源:http://zhangweiguo3984.cnblogs.com/articles/314329.html   dll下载也是这个页面   有用到的朋友就去关注下

 

 

言归正传  贴代码:

 

using System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Web;
using
System.Web.SessionState;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
using
ICSharpCode.SharpZipLib.Zip;

namespace OA
{
        /// <summary>
        /// WebForm1 的摘要说明。
        /// </summary>
        public class WebForm1 : System.Web.UI.Page
        {
              public string ServerDir;
              private void Page_Load(object sender, System.EventArgs e)
              {
                
// 在此处放置用户代码以初始化页面
                     this.ServerDir = Page.MapPath(".");
                     this.ZipFile("01.txt*02.txt*000.zip"); 
//只是示例,具体的大家自己去实现
                     this.ZipFile("01.txt*02.txt*001.zip");
                     this.UnZipFile("000.zip*001.zip");
        }


        public string ShortDir(string s)
        {
 
            //将文件的绝对路径转为相对路径
               string d=s.Replace(ServerDir,"");
               return d;
        }



        //压缩文件 p 为客户端传回来的文件列表:文件名+压缩包的名称
          public void ZipFile(string p)
          {
                   string[] tmp = p.Split(new char[]{'*'}); 
//分离文件列表
                   if(tmp[tmp.Length-1]!="")  //压缩包名称不为空
                    {
                          ZipOutputStream u = new ZipOutputStream(File.Create(ServerDir+tmp[tmp.Length-1]));            //新建压缩文件流 “ZipOutputStream”
                          for(int i =0;i<tmp.Length-1;i++)
                          {
                                 if(tmp[i]!="") 
//分离出来的文件名不为空
                                 {
                                          this.AddZipEntry(tmp[i],u,out u);
//向压缩文件流加入内容
                                 } 
                           }
                           u.Finish();
// 结束压缩
                           u.Close();
                     }
            }

            //添加压缩项目:p 为需压缩的文件或文件夹; u 为现有的源ZipOutputStream;  out j为已添加“ZipEntry”的“ZipOutputStream”
             public void AddZipEntry(string p,ZipOutputStream u,out ZipOutputStream j)
             {
                   string s =ServerDir+p;

                   if(Directory.Exists(s))  //文件夹的处理
                   {
                         DirectoryInfo di = new DirectoryInfo(s);

                        //***********以下内容是修订后添加的***********

                         if(di.GetDirectories().Length<=0)   //没有子目录
                          {
                                    ZipEntry z = new ZipEntry(p+"//");
//末尾“//”用于文件夹的标记
                                     u.PutNextEntry(z);
                           }

                            //***************以上内容是修订后添加的***************


                           foreach(DirectoryInfo tem in di.GetDirectories()) 
//获取子目录
                            {
                                    ZipEntry z = new ZipEntry(this.ShortDir(tem.FullName)+"//");
//末尾“//”用于文件夹的标记
                                     u.PutNextEntry(z);   
//此句不可少,否则空目录不会被添加
                                     s = this.ShortDir(tem.FullName);
                                     this.AddZipEntry(s,u,out u);      
//递归
                           }
                            foreach(FileInfo temp in di.GetFiles()) 
//获取此目录的文件
                           {
                                     s = this.ShortDir(temp.FullName);
                                     this.AddZipEntry(s,u,out u);   
   //递归
                           }
                     }
                     else if(File.Exists(s)) 
//文件的处理
                     {
                               u.SetLevel(9);     
//压缩等级
                                FileStream f = File.OpenRead(s);
                                byte[] b = new byte[f.Length];
                                f.Read(b,0,b.Length);       
   //将文件流加入缓冲字节中
                               ZipEntry z = new ZipEntry(this.ShortDir(s));
                               u.PutNextEntry(z);          
   //为压缩文件流提供一个容器
                               u.Write(b,0,b.Length); 
//写入字节
                               f.Close();
                      }
                      j=u;   
//返回已添加数据的“ZipOutputStream”
              }


              public void UnZipFile(string p)   //解压缩
              {
                   string[] un_tmp = p.Split(new char[]{'*'});
                   int i2=0; 
//防止名称冲突的参数
                   for(int j=0;j<un_tmp.Length;j++)
                   {
                         if(un_tmp[j]!="")
                         {
                                 string un_time=System.DateTime.Now.ToShortDateString()+"-"+System.DateTime.Now.Hour.ToString()+"-"+System.DateTime.Now.Minute.ToString()+"-"+(System.DateTime.Now.Second+i2).ToString();
                                 string un_dir =ServerDir+"Unzip-"+un_time;
                                 Directory.CreateDirectory(un_dir);  
  //创建以解压时间为名称的文件夹
                                 ZipInputStream f = new ZipInputStream(File.OpenRead(ServerDir+un_tmp[j])); //读取压缩文件,并用此文件流新建 “ZipInputStream”对象

                                 A:  ZipEntry zp = f.GetNextEntry();   //获取解压文件流中的项目。 另注(我的理解):在压缩包里每个文件都以“ZipEntry”形式存在,其中包括存放文件的目录信息。如果空目录被压缩,该目录下将出现一个名称为空、大小为 0 、“Crc”属性为 00000000 的“文件”。此文件只是个标记,不会被解压。

                                 while(zp!=null)
                                 {
                                       string un_tmp2;
                                        if(zp.Name.IndexOf("
//")>=0
) //获取文件的目录信息
                                        {
                                                 int tmp1 = zp.Name.LastIndexOf("//");
                                                 un_tmp2 = zp.Name.Substring(0,tmp1);
                                                 Directory.CreateDirectory(un_dir+"
//"+un_tmp2+"//"); //必须先创建目录,否则解压失败 --- (A) 关系到下面的步骤(B)
                                        }
                                         if(!zp.IsDirectory&&zp.Crc!=00000000L) //此“ZipEntry”不是“标记文件”
                                          {
                                                  int i =2048;
                                                 byte[] b = new byte[i]; 
//每次缓冲 2048 字节
                                                 FileStream s= File.Create(un_dir+"
//"+zp.Name); //(B)-新建文件流
                                                 while(true)
//持续读取字节,直到一个“ZipEntry”字节读完
                                                 {
                                                        i = f.Read(b,0,b.Length);
//读取“ZipEntry”中的字节
                                                         if(i>0)
                                                         {
                                                                   s.Write(b,0,i);
//将字节写入新建的文件流
                                                         }
                                                         else
                                                         {
                                                                   break;
//读取的字节为 0 ,跳出循环
                                                         }
                                                 }
                                                 s.Close();
                                           }
                                            goto A;
//进入下一个“ZipEntry”
                                     }
                                     f.Close();
                                     i2++;
                         }
                    }
              }
        }
}

这些相信有点基础的问题都不会很大了  

剩下的贴自己的代码了        我的任务要求是在datalist上用户选择某些资料然后选择导出   我要做的就是将其生成xml  然后将xml压缩成zip格式  再将xml删除   

前面就不贴了   xml已经生成   现在将其压缩

 public void ZipFile()
    {
        path = Server.MapPath(".") + "//";//生成路径
        ZipOutputStream u = new ZipOutputStream(File.Create(path+zip));//zip 是生成zip格式的名称
        for (int i = 0; i < listStr.Count; i++)//lisStr是xml文档的名称
        {
            if (listStr[i] != "")
            {
                AddZipFile(listStr[i],u,out u);
            }
        }
        u.Finish(); // 结束压缩
        u.Close();
    }

public void AddZipFile(string p, ZipOutputStream u, out ZipOutputStream j)
    {
        u.SetLevel(9);      //压缩等级
        FileStream f = File.OpenRead(path + p);
        byte[] b = new byte[f.Length];
        f.Read(b, 0, b.Length);          //将文件流加入缓冲字节中
        ZipEntry z = new ZipEntry((path+p).Replace(path,""));
        u.PutNextEntry(z);             //为压缩文件流提供一个容器
        u.Write(b, 0, b.Length);  //写入字节
        f.Close();
        j = u;//返回已添加数据的“ZipOutputStream”
        File.Delete(path+p);
    }

呵呵    大同小异了    认真研究下也不是很难了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值