C# 使用SharpZip压缩与解压缩
来源:互联网 发布:java python 比较 编辑:程序博客网 时间:2024/05/21 18:31
首先,在 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"); } 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++; } } } }}
- C# 使用SharpZip压缩与解压缩
- 使用SharpZip压缩与解压缩的实战经验
- 使用SharpZip压缩与解压缩的实战经验
- 使用SharpZip压缩与解压缩的实战经验
- 使用SharpZip压缩与解压缩的实战经验
- 使用SharpZip压缩与解压缩的实战经验
- 使用SharpZip压缩与解压缩的实战经验
- 使用SharpZip进行文件压缩
- C#压缩与解压缩文件
- c#字符串压缩与解压缩
- C# Deflate 压缩与解压缩
- C#实现压缩与解压缩
- C# 文件压缩与解压缩
- C#压缩与解压缩流类 GZipStream 的使用
- 使用DotNetZip压缩与解压缩
- 使用ZipEntry压缩与解压缩
- C#压缩与解压缩(zip文件)
- C#压缩与解压缩(zip文件)
- .net framework 4.5为啥在IIS中找不到了
- discuss
- Rdesktop协议的命令参数
- Linux9比较全
- php支持的协议和封装协议
- C# 使用SharpZip压缩与解压缩
- properties文件操作
- 802.11(wifi)中SSID、BSSID、ESSID的区别
- selenium 等待特定元素出现
- 在netron provider network环境中使用metadata
- Web应用中由JavaBuildPath(.classpath文件)引起的错误总结
- Android Bitmap's format and IplImage's format matching is very important
- Android Developers:简单的拍照
- Oracle_面向服务体系结构的基础