DotNetZip封装类
DotnetZip是一个开源类库,支持.NET的任何语言,可很方便的创建,读取,和更新zip文件。而且还可以使用在.NETCompact Framework中。
下载地址在这里:
http://dotnetzip.codeplex.com/
下载到的包里有很多个dll文件,一般引用Ionic.Zip.dll就可以:
然后引用这个命名空间:
using Ionic.Zip;
以下是我自己封装的一个类:
1 /// <summary>
2 /// Zip操作基于 DotNetZip 的封装
3 /// </summary>
4 public static class ZipUtils
5 {
6 /// <summary>
7 /// 得到指定的输入流的ZIP压缩流对象【原有流对象不会改变】
8 /// </summary>
9 /// <param name="sourceStream"></param>
10 /// <returns></returns>
11 public static Stream ZipCompress(Stream sourceStream, string entryName = "zip")
12 {
13 MemoryStream compressedStream = new MemoryStream();
14 if (sourceStream != null)
15 {
16 long sourceOldPosition = 0;
17 try
18 {
19 sourceOldPosition = sourceStream.Position;
20 sourceStream.Position = 0;
21 using (ZipFile zip = new ZipFile())
22 {
23 zip.AddEntry(entryName, sourceStream);
24 zip.Save(compressedStream);
25 compressedStream.Position = 0;
26 }
27 }
28 catch
29 {
30 }
31 finally
32 {
33 try
34 {
35 sourceStream.Position = sourceOldPosition;
36 }
37 catch
38 {
39 }
40 }
41 }
42 return compressedStream;
43 }
44
45
46 /// <summary>
47 /// 得到指定的字节数组的ZIP解压流对象
48 /// 当前方法仅适用于只有一个压缩文件的压缩包,即方法内只取压缩包中的第一个压缩文件
49 /// </summary>
50 /// <param name="sourceStream"></param>
51 /// <returns></returns>
52 public static Stream ZipDecompress(byte[] data)
53 {
54 Stream decompressedStream = new MemoryStream();
55 if (data != null)
56 {
57 try
58 {
59 MemoryStream dataStream = new MemoryStream(data);
60 using (ZipFile zip = ZipFile.Read(dataStream))
61 {
62 if (zip.Entries.Count > 0)
63 {
64 zip.Entries.First().Extract(decompressedStream);
65 // Extract方法中会操作ms,后续使用时必须先将Stream位置归零,否则会导致后续读取不到任何数据
66 // 返回该Stream对象之前进行一次位置归零动作
67 decompressedStream.Position = 0;
68 }
69 }
70 }
71 catch
72 {
73 }
74 }
75 return decompressedStream;
76 }
77
78 /// <summary>
79 /// 压缩ZIP文件
80 /// 支持多文件和多目录,或是多文件和多目录一起压缩
81 /// </summary>
82 /// <param name="list">待压缩的文件或目录集合</param>
83 /// <param name="strZipName">压缩后的文件名</param>
84 /// <param name="IsDirStruct">是否按目录结构压缩</param>
85 /// <returns>成功:true/失败:false</returns>
86 public static bool CompressMulti(List<string> list, string strZipName, bool IsDirStruct)
87 {
88 try
89 {
90 using (ZipFile zip = new ZipFile(Encoding.Default))//设置编码,解决压缩文件时中文乱码
91 {
92 foreach (string path in list)
93 {
94 string fileName = Path.GetFileName(path);//取目录名称
95 //如果是目录
96 if (Directory.Exists(path))
97 {
98 if (IsDirStruct)//按目录结构压缩
99 {
100 zip.AddDirectory(path, fileName);
101 }
102 else//目录下的文件都压缩到Zip的根目录
103 {
104 zip.AddDirectory(path);
105 }
106 }
107 if (File.Exists(path))//如果是文件
108 {
109 zip.AddFile(path);
110 }
111 }
112 zip.Save(strZipName);//压缩
113 return true;
114 }
115 }
116 catch (Exception)
117 {
118 return false;
119 }
120 }
121
122 /// <summary>
123 /// 解压ZIP文件
124 /// </summary>
125 /// <param name="strZipPath">待解压的ZIP文件</param>
126 /// <param name="strUnZipPath">解压的目录</param>
127 /// <param name="overWrite">是否覆盖</param>
128 /// <returns>成功:true/失败:false</returns>
129 public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
130 {
131 try
132 {
133 ReadOptions options = new ReadOptions();
134 options.Encoding = Encoding.Default;//设置编码,解决解压文件时中文乱码
135 using (ZipFile zip = ZipFile.Read(strZipPath, options))
136 {
137 foreach (ZipEntry entry in zip)
138 {
139 if (string.IsNullOrEmpty(strUnZipPath))
140 {
141 strUnZipPath = strZipPath.Split('.').First();
142 }
143 if (overWrite)
144 {
145 entry.Extract(strUnZipPath, ExtractExistingFileAction.OverwriteSilently);//解压文件,如果已存在就覆盖
146 }
147 else
148 {
149 entry.Extract(strUnZipPath, ExtractExistingFileAction.DoNotOverwrite);//解压文件,如果已存在不覆盖
150 }
151 }
152 return true;
153 }
154 }
155 catch (Exception)
156 {
157 return false;
158 }
159 }
160
161
162 }
2 /// Zip操作基于 DotNetZip 的封装
3 /// </summary>
4 public static class ZipUtils
5 {
6 /// <summary>
7 /// 得到指定的输入流的ZIP压缩流对象【原有流对象不会改变】
8 /// </summary>
9 /// <param name="sourceStream"></param>
10 /// <returns></returns>
11 public static Stream ZipCompress(Stream sourceStream, string entryName = "zip")
12 {
13 MemoryStream compressedStream = new MemoryStream();
14 if (sourceStream != null)
15 {
16 long sourceOldPosition = 0;
17 try
18 {
19 sourceOldPosition = sourceStream.Position;
20 sourceStream.Position = 0;
21 using (ZipFile zip = new ZipFile())
22 {
23 zip.AddEntry(entryName, sourceStream);
24 zip.Save(compressedStream);
25 compressedStream.Position = 0;
26 }
27 }
28 catch
29 {
30 }
31 finally
32 {
33 try
34 {
35 sourceStream.Position = sourceOldPosition;
36 }
37 catch
38 {
39 }
40 }
41 }
42 return compressedStream;
43 }
44
45
46 /// <summary>
47 /// 得到指定的字节数组的ZIP解压流对象
48 /// 当前方法仅适用于只有一个压缩文件的压缩包,即方法内只取压缩包中的第一个压缩文件
49 /// </summary>
50 /// <param name="sourceStream"></param>
51 /// <returns></returns>
52 public static Stream ZipDecompress(byte[] data)
53 {
54 Stream decompressedStream = new MemoryStream();
55 if (data != null)
56 {
57 try
58 {
59 MemoryStream dataStream = new MemoryStream(data);
60 using (ZipFile zip = ZipFile.Read(dataStream))
61 {
62 if (zip.Entries.Count > 0)
63 {
64 zip.Entries.First().Extract(decompressedStream);
65 // Extract方法中会操作ms,后续使用时必须先将Stream位置归零,否则会导致后续读取不到任何数据
66 // 返回该Stream对象之前进行一次位置归零动作
67 decompressedStream.Position = 0;
68 }
69 }
70 }
71 catch
72 {
73 }
74 }
75 return decompressedStream;
76 }
77
78 /// <summary>
79 /// 压缩ZIP文件
80 /// 支持多文件和多目录,或是多文件和多目录一起压缩
81 /// </summary>
82 /// <param name="list">待压缩的文件或目录集合</param>
83 /// <param name="strZipName">压缩后的文件名</param>
84 /// <param name="IsDirStruct">是否按目录结构压缩</param>
85 /// <returns>成功:true/失败:false</returns>
86 public static bool CompressMulti(List<string> list, string strZipName, bool IsDirStruct)
87 {
88 try
89 {
90 using (ZipFile zip = new ZipFile(Encoding.Default))//设置编码,解决压缩文件时中文乱码
91 {
92 foreach (string path in list)
93 {
94 string fileName = Path.GetFileName(path);//取目录名称
95 //如果是目录
96 if (Directory.Exists(path))
97 {
98 if (IsDirStruct)//按目录结构压缩
99 {
100 zip.AddDirectory(path, fileName);
101 }
102 else//目录下的文件都压缩到Zip的根目录
103 {
104 zip.AddDirectory(path);
105 }
106 }
107 if (File.Exists(path))//如果是文件
108 {
109 zip.AddFile(path);
110 }
111 }
112 zip.Save(strZipName);//压缩
113 return true;
114 }
115 }
116 catch (Exception)
117 {
118 return false;
119 }
120 }
121
122 /// <summary>
123 /// 解压ZIP文件
124 /// </summary>
125 /// <param name="strZipPath">待解压的ZIP文件</param>
126 /// <param name="strUnZipPath">解压的目录</param>
127 /// <param name="overWrite">是否覆盖</param>
128 /// <returns>成功:true/失败:false</returns>
129 public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
130 {
131 try
132 {
133 ReadOptions options = new ReadOptions();
134 options.Encoding = Encoding.Default;//设置编码,解决解压文件时中文乱码
135 using (ZipFile zip = ZipFile.Read(strZipPath, options))
136 {
137 foreach (ZipEntry entry in zip)
138 {
139 if (string.IsNullOrEmpty(strUnZipPath))
140 {
141 strUnZipPath = strZipPath.Split('.').First();
142 }
143 if (overWrite)
144 {
145 entry.Extract(strUnZipPath, ExtractExistingFileAction.OverwriteSilently);//解压文件,如果已存在就覆盖
146 }
147 else
148 {
149 entry.Extract(strUnZipPath, ExtractExistingFileAction.DoNotOverwrite);//解压文件,如果已存在不覆盖
150 }
151 }
152 return true;
153 }
154 }
155 catch (Exception)
156 {
157 return false;
158 }
159 }
160
161
162 }
使用方法:
1.压缩文件
List<string> list = new List<string>();
list.Add(@"D:\Test\ss");
list.Add(@"D:\Test\test1.jpg");
list.Add(@"D:\公司文件.txt");
list.Add(@"D:\Test\ss.xml");
bool isSuc =ZipUtils. CompressMulti(list, "D:\\Test2.zip",true);
list.Add(@"D:\Test\ss");
list.Add(@"D:\Test\test1.jpg");
list.Add(@"D:\公司文件.txt");
list.Add(@"D:\Test\ss.xml");
bool isSuc =ZipUtils. CompressMulti(list, "D:\\Test2.zip",true);
2.解压文件
bool isSuc = ZipUtils.Decompression("D:\\Test\\Test1.zip", "D:\\Teest", true);
更详细的例子在这里:
http://dotnetzip.codeplex.com/wikipage?title=Examples&referringTitle=Home