使用SharpZipLib实现zip压缩
来源:互联网 发布:java怎么打开mysql 编辑:程序博客网 时间:2024/05/17 11:37
使用国外开源加压解压库ICSharpCode.SharpZipLib实现加压,该库的官方网站为
---------------------------------------------------------------------------------------------方法二-----------------------------------------------------------------------------------------
http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
使用体验:可以照着例子实现简单的加压解压,可以加压一个文件夹中的所有文件,但没有提供加压子文件夹的说明。
目前网上的一些代码有的无法加压空文件夹,有的加压了用rar解不开,这是一点需要改进的。
但如果只需要加压文件夹第一级子目录中的“文件”(不包括文件夹和子目录)的情况,使用这个库是很方便的。而且是正常zip格式。
比.Net提供的GZipStream类强在它可以按照标准zip格式加压多个文件,而GZipStream没有提供加压多个文件的方法,需要自己定义,
这样解压也只有使用自己的程序才可以,通用性方面不如SharpZipLib。
需要添加对SharpZipLib的引用:
using ICSharpCode.SharpZipLib.Zip;
#region Zip multi files 多文件压缩 public void multiZipFile(string[] strFileList,string strFolder, string strZip) { ZipOutputStream s = new ZipOutputStream(File.Create(strZip)); s.SetLevel(6); // 0 - store only to 9 - means best compression zip(strFileList, s, strFolder); s.Finish(); s.Close(); } private void zip(string[] strFile, ZipOutputStream s, string staticFile) { Crc32 crc = new Crc32(); foreach (string file in strFile) { if (!String.IsNullOrEmpty(file)) { FileInfo fileObj = new FileInfo(file); if (fileObj.Exists) { //打开压缩文件 FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1); ZipEntry entry = new ZipEntry(tempfile); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } } } } #endregion
---------------------------------------------------------------------------------------------方法二-----------------------------------------------------------------------------------------
#region 加压解压方法 /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> /// <param name="dirPath">被压缩的文件夹夹路径</param> /// <param name="zipFilePath">生成压缩文件的路径,为空则默认与被压缩文件夹同一级目录,名称为:文件夹名+.zip</param> /// <param name="err">出错信息</param> /// <returns>是否压缩成功</returns> public bool ZipFile(string dirPath, string zipFilePath, out string err) { err = ""; if (dirPath == string.Empty) { err = "要压缩的文件夹不能为空!"; return false; } if (!Directory.Exists(dirPath)) { err = "要压缩的文件夹不存在!"; return false; } //压缩文件名为空时使用文件夹名+.zip if (zipFilePath == string.Empty) { if (dirPath.EndsWith("\\")) { dirPath = dirPath.Substring(0, dirPath.Length - 1); } zipFilePath = dirPath + ".zip"; } try { string[] filenames = Directory.GetFiles(dirPath); using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath))) { s.SetLevel(9); byte[] buffer = new byte[4096]; foreach (string file in filenames) { ZipEntry entry = new ZipEntry(Path.GetFileName(file)); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); using (FileStream fs = File.OpenRead(file)) { int sourceBytes; do { sourceBytes = fs.Read(buffer, 0, buffer.Length); s.Write(buffer, 0, sourceBytes); } while (sourceBytes > 0); } } s.Finish(); s.Close(); } } catch (Exception ex) { err = ex.Message; return false; } return true; } /// <summary> /// 功能:解压zip格式的文件。 /// </summary> /// <param name="zipFilePath">压缩文件路径</param> /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param> /// <param name="err">出错信息</param> /// <returns>解压是否成功</returns> public bool UnZipFile(string zipFilePath, string unZipDir, out string err) { err = ""; if (zipFilePath == string.Empty) { err = "压缩文件不能为空!"; return false; } if (!File.Exists(zipFilePath)) { err = "压缩文件不存在!"; return false; } //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 if (unZipDir == string.Empty) unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath)); if (!unZipDir.EndsWith("\\")) unZipDir += "\\"; if (!Directory.Exists(unZipDir)) Directory.CreateDirectory(unZipDir); try { using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); if (directoryName.Length > 0) { Directory.CreateDirectory(unZipDir + directoryName); } if (!directoryName.EndsWith("\\")) directoryName += "\\"; if (fileName != String.Empty) { using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } }//while } } catch (Exception ex) { err = ex.Message; return false; } return true; }//解压结束 #endregion
0 0
- 使用SharpZipLib实现zip压缩
- 使用SharpZipLib实现zip压缩
- 使用SharpZipLib实现zip压缩
- 使用SharpZipLib实现zip压缩
- 使用SharpZipLib实现zip压缩
- C#使用SharpZipLib实现zip压缩
- 利用SharpZipLib实现实时zip压缩下载整个目录
- 利用SharpZipLib实现实时zip压缩下载整个目录
- 利用SharpZipLib实现实时zip压缩下载整个目录
- 在C#中使用SharpZipLib压缩解压缩zip文件
- ICSharpCode.SharpZipLib.Zip 使用
- c#SharpZipLib实现压缩
- SharpZipLib Zip操作类库 压缩解压
- 使用SharpZipLib.dll动态库实现带密码压缩
- windows mobile 上文件压缩与解压缩(使用ICSharpCode.SharpZipLib.Zip)
- ICSharpCode.SharpZipLib实现压缩解压
- SharpZipLib 的使用(压缩,解压)
- C# ZIP文件的压缩和解压缩(SharpZipLib.dll)
- maven 的基本配置及个人理解
- C++对象模型 第六章 执行期语意学
- Javascript面向对象编程之一:初体验
- 【Android】Android Service 服务
- 【重磅】凯文.凯利8个小时演讲实录
- 使用SharpZipLib实现zip压缩
- Javascript面向对象编程之二:类的定义
- 23种设计模式解析
- 浅淡HTML5移动Web开发
- SVN常见错误提示说明
- 修改Linux命令行界面的分辨率
- eclipse 3.5导入和导出个性格式化配置文件
- Javascript面向对象编程之三:变量的定义
- 漂亮动画效果的Dialog--NiftyDialogEffects