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 }
时间: 2024-10-13 03:04:27

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

C#利用SharpZipLib解压或压缩文件夹实例操作

最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边

zend framework将zip格式的压缩文件导入并解压到指定文件

html代码 <pre class="php" name="code"><fieldset> <legend>批量导入学生照片</legend> <form enctype="multipart/form-data" action="/Import/importstuimg" method="post"> 导入照片压缩包文件:<input v

IOS开发—图片压缩/解压成Zip文件

图片压缩/解压成Zip文件 本文介绍如何将图片压缩成Zip文件,首先需要下载第三方库ZipArchive 并导入项目中. ZipArchive 库地址:https://github.com/mattconnolly/ZipArchive 一.文档结构: 二.准备工作: 1.框架导入: 2.ZipArchive.m文件使用非ARC机制 三.代码示例: // // ViewController.m // UnzipImgDemo // // Created byLotheve on 15/4/10.

java利用zip解压slpk文件

public static void main(String[] args) { File file = new File("C:\\Users\\Administrator\\Desktop\\aa\\sdcbz.slpk");//当前压缩文件 ZipInputStream zin;//创建ZipInputStream对象 try { ZipFile zipFile = new ZipFile(file);//创建压缩文件对象 zin = new ZipInputStream(new

[Linux] 解压tar.gz文件,解压部分文件

遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: http://www.cnblogs.com/garinzhang/archive/2013/04/23/3037147.html 使用tar –zxvf *.tar.gz无法解压,明明好好的tar.gz文件能这样解压的,为什么不能解压?   后来想了想,是不是先要解压*.gz文件,使用gunzip

[教程] wdcp文件管理器里不能删除或移动解压后的文件解决方法

问题:在本地上传压缩包到服务器之后,在wdcp文件管理器里解压,解压之后想把文件移动到其他目录,填写好移动的目标目录之后点移动,显示移动成功,但到目标目录却发现没有自己所移动的文件,文件不知道消失到哪里去了:再看原本解压后的文件夹里也没有文件. 解决方法:看看是不是自己的压缩前的文件夹里有文件名或文件夹名包含中文字符,把他改成英文后再压缩上传,解压之后移动就没问题了:同样,删除不了的文件也可能是你文件名里包含了中文,甚至上传解压之后的文件名已经不是正常中文了,而是乱码! 转自:http://ww

解压tar.gz文件报错gzip: stdin: not in gzip format解决方法

解压tar.gz文件报错gzip: stdin: not in gzip format解决方法 在解压tar.gz文件的时候报错 1 2 3 4 5 [[email protected] Downloads]$ tar -zxvf clion-141.351.4.tar.gz gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now 原来原因是这个

linux ubuntu12.04 解压中文zip文件,解压之后乱码

在windows下压缩后的zip包,在ubuntu下解压后显示为乱码问题 1.zip文件解压之后文件名乱码: 第一步 首先安装7zip和convmv(如果之前没有安装的话) 在命令行执行安装命令如下: sudo apt-get install p7zip-full convmv 第二步 假设zip文件名为y05文档.zip,那么先进入zip文件所在的目录,然后命令行执行 LANG=C 7z x y05文档.zip convmv -f cp936 -t utf8 -r --notest * 2.文

使用zlib解压.apk/.zip文件(Windows&amp;Ubuntu)

前言 前面讲过,解压出apk文件的内容是进行apk分析的第一步,而.apk文件其实就是.zip文件.也就是说首先要实现zip文件的解压缩.本文将分别介绍在Windows和Ubuntu下如何使用zlib这一开源库对zip文件进行解压. ZLIB zlib is designed to be a free, general-purpose, legally unencumbered – that is, not covered by any patents – lossless data-compr