使用ICSharpCode.SharpZipLib-(C#)实现解压缩文件的操作类
2009-07-20 11:55 chenkai 阅读(5584) 评论(1) 编辑 收藏 举报在处理后台附件上载由于文件较多,需要每个文件单独上传关键是有些文件数据量比较少 也需要单独上传,这样导致后台数据流量较大而且用户操作麻烦.
在处理这方面业务时,可以简化:首先验证用户上传文件的大小,设定不超过1M文件为限制并记录,当用户点击一次操作时后台程序把所有小数据量文件进行压缩成一个单独文件来上传,这样简化用户操作难度 增强用户体验,在获得上载文件时同样把这个文件进行解压本地即可...
使用ICSharpCode.SharpZipLib-(C#)实现解压缩文件的操作类: 完整代码如下
A:ICSharpCode.SharpZipLib.DLL组件下载地址,如果要实现必须在项目中引用该组件DLL
下载地址:http://good.gd/203866.htm
B:完整的操作类代码实例:
在处理这方面业务时,可以简化:首先验证用户上传文件的大小,设定不超过1M文件为限制并记录,当用户点击一次操作时后台程序把所有小数据量文件进行压缩成一个单独文件来上传,这样简化用户操作难度 增强用户体验,在获得上载文件时同样把这个文件进行解压本地即可...
使用ICSharpCode.SharpZipLib-(C#)实现解压缩文件的操作类: 完整代码如下
A:ICSharpCode.SharpZipLib.DLL组件下载地址,如果要实现必须在项目中引用该组件DLL
下载地址:http://good.gd/203866.htm
B:完整的操作类代码实例:
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Web;
5
6//using the Compent Comspac
7using System.IO;
8using System.Text;
9using System.Threading;
10using ICSharpCode.SharpZipLib;
11using ICSharpCode.SharpZipLib.Zip;
12using ICSharpCode.SharpZipLib.Checksums;
13
14namespace TestJqueryAjax
15{
16 /// <summary>
17 /// 使用ICSharpZipCode.Dll实现解压缩
18 /// Author:chenkai Time:2009年7月13日22:03:27
19 /// Version:Beta1.0.0-(测试版)
20 /// </summary>
21 public class ICSharpZipCodeTest
22 {
23
24 /// <summary>
25 /// 实现压缩功能
26 /// </summary>
27 /// <param name="filenameToZip">要压缩文件(绝对文件路径)</param>
28 /// <param name="Zipedfiledname">压缩(绝对文件路径)</param>
29 /// <param name="CompressionLevel">压缩比</param>
30 /// <param name="password">加密密码</param>
31 /// <param name="comment">压缩文件描述</param>
32 /// <returns>异常信息</returns>
33 public static string MakeZipFile(string[] filenameToZip, string Zipedfiledname, int CompressionLevel,
34 string password, string comment)
35 {
36 try
37 {
38 //使用正则表达式-判断压缩文件路径
39 System.Text.RegularExpressions.Regex newRegex = new System.Text.
40 RegularExpressions.Regex(@"^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w ]*.*))");
41
42 if (!newRegex.Match(Zipedfiledname).Success)
43 {
44 File.Delete(Zipedfiledname);
45 return "压缩文件的路径有误!";
46 }
47
48 //创建ZipFileOutPutStream
49 ZipOutputStream newzipstream = new ZipOutputStream(File.Open(Zipedfiledname,
50 FileMode.OpenOrCreate));
51
52 //判断Password
53 if (password != null && password.Length > 0)
54 {
55 newzipstream.Password = password;
56 }
57
58 if (comment != null && comment.Length > 0)
59 {
60 newzipstream.SetComment(comment);
61 }
62
63 //设置CompressionLevel
64 newzipstream.SetLevel(CompressionLevel); //-查看0 - means store only to 9 - means best compression
65
66 //执行压缩
67 foreach (string filename in filenameToZip)
68 {
69 FileStream newstream = File.OpenRead(filename);//打开预压缩文件
70
71 //判断路径
72 if (!newRegex.Match(Zipedfiledname).Success)
73 {
74 File.Delete(Zipedfiledname);
75 return "压缩文件目标路径不存在!";
76 }
77
78 byte[] setbuffer=new byte[newstream.Length];
79 newstream.Read(setbuffer,0,setbuffer.Length);//读入文件
80
81 //新建ZipEntrity
82 ZipEntry newEntry = new ZipEntry(filename);
83
84 //设置时间-长度
85 newEntry.DateTime = DateTime.Now;
86 newEntry.Size = newstream.Length;
87
88 newstream.Close();
89
90 newzipstream.PutNextEntry(newEntry);//压入
91
92 newzipstream.Write(setbuffer,0,setbuffer.Length);
93
94 }
95 //重复压入操作
96 newzipstream.Finish();
97 newzipstream.Close();
98
99 }catch (Exception e)
100 {
101 //出现异常
102 File.Delete(Zipedfiledname);
103 return e.Message.ToString();
104 }
105
106 return "";
107 }
108
109 /// <summary>
110 /// 实现解压操作
111 /// </summary>
112 /// <param name="zipfilename">要解压文件Zip(物理路径)</param>
113 /// <param name="UnZipDir">解压目的路径(物理路径)</param>
114 /// <param name="password">解压密码</param>
115 /// <returns>异常信息</returns>
116 public static string UnMakeZipFile(string zipfilename,string UnZipDir,string password)
117 {
118 //判断待解压文件路径
119 if (!File.Exists(zipfilename))
120 {
121 File.Delete(UnZipDir);
122 return "待解压文件路径不存在!";
123 }
124
125 //创建ZipInputStream
126 ZipInputStream newinStream = new ZipInputStream(File.OpenRead(zipfilename));
127
128 //判断Password
129 if (password != null && password.Length > 0)
130 {
131 newinStream.Password = password;
132 }
133
134 //执行解压操作
135 try
136 {
137 ZipEntry theEntry;
138
139 //获取Zip中单个File
140 while ((theEntry = newinStream.GetNextEntry()) != null)
141 {
142 //判断目的路径
143 if (Directory.Exists(UnZipDir))
144 {
145 Directory.CreateDirectory(UnZipDir);//创建目的目录
146 }
147
148 //获得目的目录信息
149 string Driectoryname = Path.GetDirectoryName(UnZipDir);
150 string pathname = Path.GetDirectoryName(theEntry.Name);//获得子级目录
151 string filename = Path.GetFileName(theEntry.Name);//获得子集文件名
152
153 //处理文件盘符问题
154 pathname = pathname.Replace(":", "$");//处理当前压缩出现盘符问题
155 Driectoryname = Driectoryname + "\\" + pathname;
156
157 //创建
158 Directory.CreateDirectory(Driectoryname);
159
160 //解压指定子目录
161 if (filename != string.Empty)
162 {
163 FileStream newstream = File.Create(Driectoryname + "\\" + pathname);
164
165 int size = 2048;
166
167 byte[] newbyte = new byte[size];
168
169 while (true)
170 {
171 size = newinStream.Read(newbyte, 0, newbyte.Length);
172
173 if (size > 0)
174 {
175 //写入数据
176 newstream.Write(newbyte, 0, size);
177 }
178 else
179 {
180 break;
181 }
182 newstream.Close();
183 }
184 }
185
186 }
187 newinStream.Close();
188 }
189 catch (Exception se)
190 {
191
192 return se.Message.ToString();
193 }
194 finally
195 {
196 newinStream.Close();
197 }
198
199
200 return "";
201 }
202 }
203}
204
2using System.Collections.Generic;
3using System.Linq;
4using System.Web;
5
6//using the Compent Comspac
7using System.IO;
8using System.Text;
9using System.Threading;
10using ICSharpCode.SharpZipLib;
11using ICSharpCode.SharpZipLib.Zip;
12using ICSharpCode.SharpZipLib.Checksums;
13
14namespace TestJqueryAjax
15{
16 /// <summary>
17 /// 使用ICSharpZipCode.Dll实现解压缩
18 /// Author:chenkai Time:2009年7月13日22:03:27
19 /// Version:Beta1.0.0-(测试版)
20 /// </summary>
21 public class ICSharpZipCodeTest
22 {
23
24 /// <summary>
25 /// 实现压缩功能
26 /// </summary>
27 /// <param name="filenameToZip">要压缩文件(绝对文件路径)</param>
28 /// <param name="Zipedfiledname">压缩(绝对文件路径)</param>
29 /// <param name="CompressionLevel">压缩比</param>
30 /// <param name="password">加密密码</param>
31 /// <param name="comment">压缩文件描述</param>
32 /// <returns>异常信息</returns>
33 public static string MakeZipFile(string[] filenameToZip, string Zipedfiledname, int CompressionLevel,
34 string password, string comment)
35 {
36 try
37 {
38 //使用正则表达式-判断压缩文件路径
39 System.Text.RegularExpressions.Regex newRegex = new System.Text.
40 RegularExpressions.Regex(@"^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w ]*.*))");
41
42 if (!newRegex.Match(Zipedfiledname).Success)
43 {
44 File.Delete(Zipedfiledname);
45 return "压缩文件的路径有误!";
46 }
47
48 //创建ZipFileOutPutStream
49 ZipOutputStream newzipstream = new ZipOutputStream(File.Open(Zipedfiledname,
50 FileMode.OpenOrCreate));
51
52 //判断Password
53 if (password != null && password.Length > 0)
54 {
55 newzipstream.Password = password;
56 }
57
58 if (comment != null && comment.Length > 0)
59 {
60 newzipstream.SetComment(comment);
61 }
62
63 //设置CompressionLevel
64 newzipstream.SetLevel(CompressionLevel); //-查看0 - means store only to 9 - means best compression
65
66 //执行压缩
67 foreach (string filename in filenameToZip)
68 {
69 FileStream newstream = File.OpenRead(filename);//打开预压缩文件
70
71 //判断路径
72 if (!newRegex.Match(Zipedfiledname).Success)
73 {
74 File.Delete(Zipedfiledname);
75 return "压缩文件目标路径不存在!";
76 }
77
78 byte[] setbuffer=new byte[newstream.Length];
79 newstream.Read(setbuffer,0,setbuffer.Length);//读入文件
80
81 //新建ZipEntrity
82 ZipEntry newEntry = new ZipEntry(filename);
83
84 //设置时间-长度
85 newEntry.DateTime = DateTime.Now;
86 newEntry.Size = newstream.Length;
87
88 newstream.Close();
89
90 newzipstream.PutNextEntry(newEntry);//压入
91
92 newzipstream.Write(setbuffer,0,setbuffer.Length);
93
94 }
95 //重复压入操作
96 newzipstream.Finish();
97 newzipstream.Close();
98
99 }catch (Exception e)
100 {
101 //出现异常
102 File.Delete(Zipedfiledname);
103 return e.Message.ToString();
104 }
105
106 return "";
107 }
108
109 /// <summary>
110 /// 实现解压操作
111 /// </summary>
112 /// <param name="zipfilename">要解压文件Zip(物理路径)</param>
113 /// <param name="UnZipDir">解压目的路径(物理路径)</param>
114 /// <param name="password">解压密码</param>
115 /// <returns>异常信息</returns>
116 public static string UnMakeZipFile(string zipfilename,string UnZipDir,string password)
117 {
118 //判断待解压文件路径
119 if (!File.Exists(zipfilename))
120 {
121 File.Delete(UnZipDir);
122 return "待解压文件路径不存在!";
123 }
124
125 //创建ZipInputStream
126 ZipInputStream newinStream = new ZipInputStream(File.OpenRead(zipfilename));
127
128 //判断Password
129 if (password != null && password.Length > 0)
130 {
131 newinStream.Password = password;
132 }
133
134 //执行解压操作
135 try
136 {
137 ZipEntry theEntry;
138
139 //获取Zip中单个File
140 while ((theEntry = newinStream.GetNextEntry()) != null)
141 {
142 //判断目的路径
143 if (Directory.Exists(UnZipDir))
144 {
145 Directory.CreateDirectory(UnZipDir);//创建目的目录
146 }
147
148 //获得目的目录信息
149 string Driectoryname = Path.GetDirectoryName(UnZipDir);
150 string pathname = Path.GetDirectoryName(theEntry.Name);//获得子级目录
151 string filename = Path.GetFileName(theEntry.Name);//获得子集文件名
152
153 //处理文件盘符问题
154 pathname = pathname.Replace(":", "$");//处理当前压缩出现盘符问题
155 Driectoryname = Driectoryname + "\\" + pathname;
156
157 //创建
158 Directory.CreateDirectory(Driectoryname);
159
160 //解压指定子目录
161 if (filename != string.Empty)
162 {
163 FileStream newstream = File.Create(Driectoryname + "\\" + pathname);
164
165 int size = 2048;
166
167 byte[] newbyte = new byte[size];
168
169 while (true)
170 {
171 size = newinStream.Read(newbyte, 0, newbyte.Length);
172
173 if (size > 0)
174 {
175 //写入数据
176 newstream.Write(newbyte, 0, size);
177 }
178 else
179 {
180 break;
181 }
182 newstream.Close();
183 }
184 }
185
186 }
187 newinStream.Close();
188 }
189 catch (Exception se)
190 {
191
192 return se.Message.ToString();
193 }
194 finally
195 {
196 newinStream.Close();
197 }
198
199
200 return "";
201 }
202 }
203}
204