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
投稿

猜你喜欢

  • hibernate4基本配置方式详解

    2023-03-11 11:07:43
  • 详解Spring Boot Junit单元测试

    2021-10-25 23:13:55
  • 简介Java的Hibernate框架中的Session和持久化类

    2023-04-17 14:41:13
  • Android防止点击过快造成多次响应事件的解决方法

    2023-05-24 16:26:09
  • Java多线程之Park和Unpark原理

    2023-03-29 15:46:11
  • JavaFX 监听窗口关闭事件实例详解

    2023-07-20 21:53:06
  • c# WPF中自定义加载时实现带动画效果的Form和FormItem

    2021-05-29 22:49:17
  • 理解Java中的内存泄露及解决方法示例

    2023-04-24 23:19:51
  • springboot实现配置两个parent的方法

    2022-04-05 07:54:43
  • 详解Java递归实现树形结构的两种方式

    2023-02-18 07:24:47
  • Android中SeekBar和RatingBar用法实例分析

    2023-07-28 00:13:59
  • Java性能优化之数据结构实例代码

    2022-01-21 14:46:02
  • SpringBoot AOP方式实现多数据源切换的方法

    2023-04-08 20:58:08
  • Unity中的PostProcessScene实用案例深入解析

    2021-06-09 04:57:28
  • C#获取全部目录和文件的简单实例

    2021-09-01 02:51:00
  • Android编程实现的一键锁屏程序详解

    2022-09-03 16:44:27
  • android Launcher3设置默认桌面应用

    2022-07-20 20:18:42
  • C++类中的六大默认成员函数详解

    2022-09-18 01:33:01
  • 深入分析java并发编程中volatile的实现原理

    2023-11-23 05:02:25
  • IDEA中配置文件模板的添加方法

    2023-10-28 17:52:31
  • asp之家 软件编程 m.aspxhome.com