使用sharpziplib解压缩文件与文件夹

博客介绍了支持中文名称的方法,需在指定网址下载源码并修改相关代码。还给出了ASP.NET中文件压缩与解压缩的代码,包括压缩文件、添加压缩项目和解压缩等功能的实现,涉及文件和文件夹的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主  题:奉送100分并拿出使用SharpZip压缩与解压缩的实战经验与大家一起分享!(已整理)
作  者:cityhunter172 (寒羽枫)
等  级:
信 誉 值:100
所属论坛:.NET技术 asp.net
问题点数:100
回复次数:104
发表时间:2003-10-21 10:14:03Z

如此就可支持中文名称了首先,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx下载源码,找到“ZipConstants.cs”修改 public static string ConvertToString(byte[] data) { return Encoding.GetEncoding("gb2312").GetString(data, 0, data.Length); //return Encoding.ASCII.GetString(data,0, data.Length); } public static byte[] ConvertToArray(string str) { return Encoding.GetEncoding("gb2312").GetBytes(str); //return Encoding.ASCII.GetBytes(str); }
以下是我写的压缩与解压缩的代码:
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");
  }

   #region Web Form Designer generated code
   override protected void OnInit(EventArgs e)
   {
    // CODEGEN:该调用是 asp.net Web 窗体设计器所必需的。
    InitializeComponent();
    base.OnInit(e);
    }
     /// <summary>
     /// 设计器支持所需的方法 - 不要使用代码编辑器修改
     /// 此方法的内容。
     /// </summary>
  private void InitializeComponent()
  {   
    this.Load += new System.EventHandler(this.Page_Load);
  }
   #endregion

//压缩文件 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++;
     }
    }
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值