C# 使用SharpZipLib生成压缩包的实例代码

作者:Alan.hsiang 时间:2021-08-29 20:32:57 

本文通过一个简单的小例子简述SharpZipLib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正。

什么是SharpZipLib ?

SharpZipLib是一个C#的类库,主要用来解压缩Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式实现,可以方便的应用于其他的项目之中。

在工程中引用SharpZipLib

在项目中,点击项目名称右键-->管理NuGet程序包,打开NuGet包管理器窗口,进行搜索下载即可,如下图所示:

C# 使用SharpZipLib生成压缩包的实例代码

SharpZipLib的关键类结构图

如下所示:

C# 使用SharpZipLib生成压缩包的实例代码

涉及知识点:

•ZipOutputStream 压缩输出流,将文件一个接一个的写入压缩文档,此类不是线程安全的。
•PutNextEntry 开始一个新的ZIP条目,ZipOutputStream中的方法。
•ZipEntry 一个ZIP文件中的条目,可以理解为压缩包里面的一个文件夹/文件。
•ZipInputStream 解压缩输出流,从压缩包中一个接一个的读出文档。
•GetNextEntry 读出ZIP条目,ZipInputStream中的方法。

示例效果图:

关于解压缩小例子的示例效果图,如下:

C# 使用SharpZipLib生成压缩包的实例代码

核心代码


using ICSharpCode.SharpZipLib.Checksum;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoZip
{
 class ZipHelper
 {
   private string rootPath = string.Empty;
   #region 压缩
   /// <summary>  
   /// 递归压缩文件夹的内部方法  
   /// </summary>  
   /// <param name="folderToZip">要压缩的文件夹路径</param>  
   /// <param name="zipStream">压缩输出流</param>  
   /// <param name="parentFolderName">此文件夹的上级文件夹</param>  
   /// <returns></returns>  
   private bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)
   {
     bool result = true;
     string[] folders, files;
     ZipEntry ent = null;
     FileStream fs = null;
     Crc32 crc = new Crc32();
     try
     {
       string entName = folderToZip.Replace(this.rootPath, string.Empty)+"/";
       //Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/")
       ent = new ZipEntry(entName);
       zipStream.PutNextEntry(ent);
       zipStream.Flush();
       files = Directory.GetFiles(folderToZip);
       foreach (string file in files)
       {
         fs = File.OpenRead(file);
         byte[] buffer = new byte[fs.Length];
         fs.Read(buffer, 0, buffer.Length);
         ent = new ZipEntry(entName + Path.GetFileName(file));
         ent.DateTime = DateTime.Now;
         ent.Size = fs.Length;
         fs.Close();
         crc.Reset();
         crc.Update(buffer);
         ent.Crc = crc.Value;
         zipStream.PutNextEntry(ent);
         zipStream.Write(buffer, 0, buffer.Length);
       }
     }
     catch
     {
       result = false;
     }
     finally
     {
       if (fs != null)
       {
         fs.Close();
         fs.Dispose();
       }
       if (ent != null)
       {
         ent = null;
       }
       GC.Collect();
       GC.Collect(1);
     }
     folders = Directory.GetDirectories(folderToZip);
     foreach (string folder in folders)
       if (!ZipDirectory(folder, zipStream, folderToZip))
         return false;
     return result;
   }
   /// <summary>  
   /// 压缩文件夹  
   /// </summary>  
   /// <param name="folderToZip">要压缩的文件夹路径</param>  
   /// <param name="zipedFile">压缩文件完整路径</param>  
   /// <param name="password">密码</param>  
   /// <returns>是否压缩成功</returns>  
   public bool ZipDirectory(string folderToZip, string zipedFile, string password)
   {
     bool result = false;
     if (!Directory.Exists(folderToZip))
       return result;
     ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));
     zipStream.SetLevel(6);
     if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
     result = ZipDirectory(folderToZip, zipStream, "");
     zipStream.Finish();
     zipStream.Close();
     return result;
   }
   /// <summary>  
   /// 压缩文件夹  
   /// </summary>  
   /// <param name="folderToZip">要压缩的文件夹路径</param>  
   /// <param name="zipedFile">压缩文件完整路径</param>  
   /// <returns>是否压缩成功</returns>  
   public bool ZipDirectory(string folderToZip, string zipedFile)
   {
     bool result = ZipDirectory(folderToZip, zipedFile, null);
     return result;
   }
   /// <summary>  
   /// 压缩文件  
   /// </summary>  
   /// <param name="fileToZip">要压缩的文件全名</param>  
   /// <param name="zipedFile">压缩后的文件名</param>  
   /// <param name="password">密码</param>  
   /// <returns>压缩结果</returns>  
   public bool ZipFile(string fileToZip, string zipedFile, string password)
   {
     bool result = true;
     ZipOutputStream zipStream = null;
     FileStream fs = null;
     ZipEntry ent = null;
     if (!File.Exists(fileToZip))
       return false;
     try
     {
       fs = File.OpenRead(fileToZip);
       byte[] buffer = new byte[fs.Length];
       fs.Read(buffer, 0, buffer.Length);
       fs.Close();
       fs = File.Create(zipedFile);
       zipStream = new ZipOutputStream(fs);
       if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
       ent = new ZipEntry(Path.GetFileName(fileToZip));
       zipStream.PutNextEntry(ent);
       zipStream.SetLevel(6);
       zipStream.Write(buffer, 0, buffer.Length);
     }
     catch
     {
       result = false;
     }
     finally
     {
       if (zipStream != null)
       {
         zipStream.Finish();
         zipStream.Close();
       }
       if (ent != null)
       {
         ent = null;
       }
       if (fs != null)
       {
         fs.Close();
         fs.Dispose();
       }
     }
     GC.Collect();
     GC.Collect(1);
     return result;
   }
   /// <summary>  
   /// 压缩文件  
   /// </summary>  
   /// <param name="fileToZip">要压缩的文件全名</param>  
   /// <param name="zipedFile">压缩后的文件名</param>  
   /// <returns>压缩结果</returns>  
   public bool ZipFile(string fileToZip, string zipedFile)
   {
     bool result = ZipFile(fileToZip, zipedFile, null);
     return result;
   }
   /// <summary>  
   /// 压缩文件或文件夹  
   /// </summary>  
   /// <param name="fileToZip">要压缩的路径</param>  
   /// <param name="zipedFile">压缩后的文件名</param>  
   /// <param name="password">密码</param>  
   /// <returns>压缩结果</returns>  
   public bool Zip(string fileToZip, string zipedFile, string password)
   {
     bool result = false;
     if (Directory.Exists(fileToZip))
     {
       this.rootPath = Path.GetDirectoryName(fileToZip);
       result = ZipDirectory(fileToZip, zipedFile, password);
     }
     else if (File.Exists(fileToZip))
     {
       this.rootPath = Path.GetDirectoryName(fileToZip);
       result = ZipFile(fileToZip, zipedFile, password);
     }
     return result;
   }
   /// <summary>  
   /// 压缩文件或文件夹  
   /// </summary>  
   /// <param name="fileToZip">要压缩的路径</param>  
   /// <param name="zipedFile">压缩后的文件名</param>  
   /// <returns>压缩结果</returns>  
   public bool Zip(string fileToZip, string zipedFile)
   {
     bool result = Zip(fileToZip, zipedFile, null);
     return result;
   }
   #endregion
   #region 解压
   /// <summary>  
   /// 解压功能(解压压缩文件到指定目录)  
   /// </summary>  
   /// <param name="fileToUnZip">待解压的文件</param>  
   /// <param name="zipedFolder">指定解压目标目录</param>  
   /// <param name="password">密码</param>  
   /// <returns>解压结果</returns>  
   public bool UnZip(string fileToUnZip, string zipedFolder, string password)
   {
     bool result = true;
     FileStream fs = null;
     ZipInputStream zipStream = null;
     ZipEntry ent = null;
     string fileName;
     if (!File.Exists(fileToUnZip))
       return false;
     if (!Directory.Exists(zipedFolder))
       Directory.CreateDirectory(zipedFolder);
     try
     {
       zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));
       if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
       while ((ent = zipStream.GetNextEntry()) != null)
       {
         if (!string.IsNullOrEmpty(ent.Name))
         {
           fileName = Path.Combine(zipedFolder, ent.Name);
           fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi  
           if (fileName.EndsWith("\\"))
           {
             Directory.CreateDirectory(fileName);
             continue;
           }
           fs = File.Create(fileName);
           int size = 2048;
           byte[] data = new byte[size];
           while (true)
           {
             size = zipStream.Read(data, 0, data.Length);
             if (size > 0)
               fs.Write(data, 0, data.Length);
             else
               break;
           }
         }
       }
     }
     catch
     {
       result = false;
     }
     finally
     {
       if (fs != null)
       {
         fs.Close();
         fs.Dispose();
       }
       if (zipStream != null)
       {
         zipStream.Close();
         zipStream.Dispose();
       }
       if (ent != null)
       {
         ent = null;
       }
       GC.Collect();
       GC.Collect(1);
     }
     return result;
   }
   /// <summary>  
   /// 解压功能(解压压缩文件到指定目录)  
   /// </summary>  
   /// <param name="fileToUnZip">待解压的文件</param>  
   /// <param name="zipedFolder">指定解压目标目录</param>  
   /// <returns>解压结果</returns>  
   public bool UnZip(string fileToUnZip, string zipedFolder)
   {
     bool result = UnZip(fileToUnZip, zipedFolder, null);
     return result;
   }
   #endregion
 }
}

备注

关于生成压缩的方法还有很多,如通过命令行调用winrar的执行文件,SharpZipLib只是方法之一。

关于SharpZipLib的的API文档,可参看链接。

总结

以上所述是小编给大家介绍的C# 使用SharpZipLib生成压缩包的实例代码网站的支持!

来源:https://www.cnblogs.com/hsiang/archive/2018/09/28/9721423.html

标签:c#,SharpZipLib,压缩包
0
投稿

猜你喜欢

  • Java设计模式之原型设计示例详解

    2023-08-04 04:53:35
  • 一篇文章超详细的介绍Java继承

    2023-11-23 08:30:12
  • JavaCV实现读取视频信息及自动截取封面图详解

    2022-05-20 14:43:05
  • Java 容器类源码详解 Set

    2022-03-21 18:08:40
  • 浅谈java并发之计数器CountDownLatch

    2023-03-21 23:42:59
  • Java装饰器设计模式初探

    2021-08-17 17:23:46
  • Java实现走迷宫回溯算法

    2022-06-02 05:11:29
  • tk.mybatis实现uuid主键生成的示例代码

    2022-01-22 00:17:13
  • 详解WMI RPC 服务器不可用的解决方案

    2023-09-14 14:51:54
  • Android实现CoverFlow效果控件的实例代码

    2023-06-23 13:12:43
  • java微信支付接入流程详解

    2023-07-28 18:37:46
  • Java中对话框的弹出方法

    2022-04-24 14:35:52
  • java 多态性详解及简单实例

    2021-10-06 23:29:50
  • Java中List与数组之间的相互转换

    2023-09-10 03:44:28
  • 关于C#委托三种调用的分享使用

    2022-10-29 03:24:35
  • elasticsearch集群发现zendiscovery的Ping机制分析

    2021-05-25 05:40:55
  • Spring AOP原理及动态代理

    2023-06-19 18:59:56
  • ThreadLocal使用案例_动力节点Java学院整理

    2021-06-08 09:57:15
  • Go Java算法猜数字游戏示例详解

    2022-03-02 21:01:50
  • Quartz.Net调度框架配置解析

    2021-10-13 01:35:02
  • asp之家 软件编程 m.aspxhome.com