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

 更新时间:2020年6月25日 11:15  点击:1769

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

什么是SharpZipLib ?

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

在工程中引用SharpZipLib

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

SharpZipLib的关键类结构图

如下所示:

涉及知识点:

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

示例效果图:

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

核心代码

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生成压缩包的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对猪先飞网站的支持!

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25