奉送100分并拿出使用SharpZip压缩与解压缩的实战经验与大家一起分享!(已整理)

cityhunter172 2003-10-21 10:14:03
首先,在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);
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++;
}
}
}
}
}
...全文
217 104 打赏 收藏 转发到动态 举报
写回复
用AI写文章
104 条回复
切换为时间正序
请发表友善的回复…
发表回复
phisoft 2004-03-03
  • 打赏
  • 举报
回复
rer
nenuphar 2004-02-23
  • 打赏
  • 举报
回复
第一次觉得江西是近的
cityhunter172 2004-02-13
  • 打赏
  • 举报
回复
developerwork@yahoo.com.cn
quyj 2004-01-14
  • 打赏
  • 举报
回复
学习,谢谢
animators 2003-11-28
  • 打赏
  • 举报
回复
太感谢了,我正需要!
SunofNight 2003-11-28
  • 打赏
  • 举报
回复
楼主真好人:)
stephenli 2003-11-28
  • 打赏
  • 举报
回复
很不错!谢谢........
tianshaguxing7358 2003-11-28
  • 打赏
  • 举报
回复
不错!
Interliu 2003-11-28
  • 打赏
  • 举报
回复
again
Interliu 2003-11-28
  • 打赏
  • 举报
回复
up
WUNEN 2003-11-28
  • 打赏
  • 举报
回复
谢了
brightheroes 2003-11-28
  • 打赏
  • 举报
回复
up
colee 2003-11-28
  • 打赏
  • 举报
回复
好东东
zhouqi66 2003-11-27
  • 打赏
  • 举报
回复
学习楼主大无畏的程序员精神!
rock1981 2003-11-27
  • 打赏
  • 举报
回复
谢谢........
悟空师傅来了 2003-11-26
  • 打赏
  • 举报
回复
谢谢........
laughingrat 2003-11-26
  • 打赏
  • 举报
回复
学习
Soking 2003-11-26
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2377/2377844.xml?temp=.4852106
健者天行 2003-11-25
  • 打赏
  • 举报
回复
学习!
newnan 2003-11-25
  • 打赏
  • 举报
回复
收集整理学习!
加载更多回复(84)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧