C#利用SharpZipLib解压或压缩文件(支持多层目录递归压缩)

需要下载ICSharpCode.SharpZipLib.dll

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 using System.IO;
  8 using ICSharpCode.SharpZipLib.Checksums;
  9 using ICSharpCode.SharpZipLib.Zip;
 10 using ICSharpCode.SharpZipLib.GZip;
 11 
 12 namespace ZYOfficeWrap
 13 {
 14 
 15     /// <summary>
 16     /// 压缩文件格式
 17     /// </summary>
 18 
 19     public enum fileType
 20     {
 21         Zip = 1,
 22         RAR = 2,
 23         Tar =3
 24     }
 25     /// <summary>
 26     /// 文件解压缩操作类库
 27     /// </summary>
 28     public class FileZipOpr
 29     {
 30         /// <summary>
 31         /// 构造函数
 32         /// </summary>
 33         public FileZipOpr()
 34         {
 35             
 36         }
 37 
 38         /// <summary>
 39         /// 压缩单个文件
 40         /// </summary>
 41         /// <param name="fileToZip">要压缩的文件</param>
 42         /// <param name="zipedFile">压缩后的文件</param>
 43         /// <param name="compressionLevel">压缩等级</param>
 44         /// <param name="blockSize">每次写入大小</param>
 45         public  void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)
 46         {
 47             //如果文件没有找到,则报错
 48             if (!File.Exists(fileToZip))
 49             {
 50                 throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
 51             }
 52 
 53             using (FileStream ZipFile = File.Create(zipedFile))
 54             {
 55                 using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
 56                 {
 57                     using (FileStream StreamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read))
 58                     {
 59                         string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);
 60                         ZipEntry ZipEntry = new ZipEntry(fileName);
 61                         ZipStream.PutNextEntry(ZipEntry);
 62                         ZipStream.SetLevel(compressionLevel);
 63                         byte[] buffer = new byte[blockSize];
 64                         int sizeRead = 0;
 65                         try
 66                         {
 67                             do
 68                             {
 69                                 sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
 70                                 ZipStream.Write(buffer, 0, sizeRead);
 71                             }
 72                             while (sizeRead > 0);
 73                         }
 74                         catch (System.Exception ex)
 75                         {
 76                             throw ex;
 77                         }
 78                         StreamToZip.Close();
 79                     }
 80 
 81                     ZipStream.Finish();
 82                     ZipStream.Close();
 83                 }
 84                 ZipFile.Close();
 85             }
 86         }
 87 
 88         /// <summary>
 89         /// 压缩单个文件
 90         /// </summary>
 91         /// <param name="fileToZip">要进行压缩的文件名</param>
 92         /// <param name="zipedFile">压缩后生成的压缩文件名</param>
 93         public  void ZipFile(string fileToZip, string zipedFile)
 94         {
 95             //如果文件没有找到,则报错
 96             if (!File.Exists(fileToZip))
 97             {
 98                 throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
 99             }
100 
101             using (FileStream fs = File.OpenRead(fileToZip))
102             {
103                 byte[] buffer = new byte[fs.Length];
104                 fs.Read(buffer, 0, buffer.Length);
105                 fs.Close();
106 
107                 using (FileStream ZipFile = File.Create(zipedFile))
108                 {
109                     using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
110                     {
111                         string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);
112                         ZipEntry ZipEntry = new ZipEntry(fileName);
113                         ZipStream.PutNextEntry(ZipEntry);
114                         ZipStream.SetLevel(5);
115 
116                         ZipStream.Write(buffer, 0, buffer.Length);
117                         ZipStream.Finish();
118                         ZipStream.Close();
119                     }
120                 }
121             }
122         }
123 
124         /// <summary>
125         /// 压缩多层目录
126         /// </summary>
127         /// <param name="strDirectory">要进行压缩的文件夹</param>
128         /// <param name="zipedFile">压缩后生成的压缩文件名</param>
129         public  void ZipFileDirectory(string strDirectory, string zipedFile)
130         {
131             using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))
132             {
133                 using (ZipOutputStream s = new ZipOutputStream(ZipFile))
134                 {
135                     ZipSetp(strDirectory, s, "");
136                 }
137             }
138         }
139 
140         /// <summary>
141         /// 递归遍历目录
142         /// </summary>
143         /// <param name="strDirectory">文件夹名称</param>
144         /// <param name="s">The ZipOutputStream Object.</param>
145         /// <param name="parentPath"></param>
146         private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)
147         {
148             if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
149             {
150                 strDirectory += Path.DirectorySeparatorChar;
151             }
152             Crc32 crc = new Crc32();
153 
154             string[] filenames = Directory.GetFileSystemEntries(strDirectory);
155 
156             foreach (string file in filenames)// 遍历所有的文件和目录
157             {
158 
159                 if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
160                 {
161                     string pPath = parentPath;
162                     pPath += file.Substring(file.LastIndexOf("\\") + 1);
163                     pPath += "\\";
164                     ZipSetp(file, s, pPath);
165                 }
166 
167                 else // 否则直接压缩文件
168                 {
169                     //打开压缩文件
170                     using (FileStream fs = File.OpenRead(file))
171                     {
172 
173                         byte[] buffer = new byte[fs.Length];
174                         fs.Read(buffer, 0, buffer.Length);
175 
176                         string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1);
177                         ZipEntry entry = new ZipEntry(fileName);
178 
179                         entry.DateTime = DateTime.Now;
180                         entry.Size = fs.Length;
181 
182                         fs.Close();
183 
184                         crc.Reset();
185                         crc.Update(buffer);
186 
187                         entry.Crc = crc.Value;
188                         s.PutNextEntry(entry);
189 
190                         s.Write(buffer, 0, buffer.Length);
191                     }
192                 }
193             }
194         }
195 
196         /// <summary>
197         /// 解压缩一个 zip 文件。
198         /// </summary>
199         /// <param name="zipedFile">The ziped file.</param>
200         /// <param name="strDirectory">The STR directory.</param>
201         /// <param name="password">zip 文件的密码。</param>
202         /// <param name="overWrite">是否覆盖已存在的文件。</param>
203         public void UnZipFile(string zipedFile, string strDirectory, string password, bool overWrite)
204         {
205 
206             if (strDirectory == "")
207                 strDirectory = Directory.GetCurrentDirectory();
208             if (!strDirectory.EndsWith("\\"))
209                 strDirectory = strDirectory + "\\";
210 
211             using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))
212             {
213                 s.Password = password;
214                 ZipEntry theEntry;
215 
216                 while ((theEntry = s.GetNextEntry()) != null)
217                 {
218                     string directoryName = "";
219                     string pathToZip = "";
220                     pathToZip = theEntry.Name;
221 
222                     if (pathToZip != "")
223                         directoryName = Path.GetDirectoryName(pathToZip) + "\\";
224 
225                     string fileName = Path.GetFileName(pathToZip);
226 
227                     Directory.CreateDirectory(strDirectory + directoryName);
228 
229                     if (fileName != "")
230                     {
231                         if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName)))
232                         {
233                             using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName))
234                             {
235                                 int size = 2048;
236                                 byte[] data = new byte[2048];
237                                 while (true)
238                                 {
239                                     size = s.Read(data, 0, data.Length);
240 
241                                     if (size > 0)
242                                         streamWriter.Write(data, 0, size);
243                                     else
244                                         break;
245                                 }
246                                 streamWriter.Close();
247                             }
248                         }
249                     }
250                 }
251 
252                 s.Close();
253             }
254         }
255 
256     }
257 }

 

posted @ 2016-10-15 16:56  风谷逍遥客  阅读(1812)  评论(0编辑  收藏  举报