栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本文通过一个简单的小例子简述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 压缩 
    ///   
    /// 递归压缩文件夹的内部方法  
    ///   
    /// 要压缩的文件夹路径  
    /// 压缩输出流  
    /// 此文件夹的上级文件夹  
    ///   
    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;
    }
    ///   
    /// 压缩文件夹  
    ///   
    /// 要压缩的文件夹路径  
    /// 压缩文件完整路径  
    /// 密码  
    /// 是否压缩成功  
    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;
    }
    ///   
    /// 压缩文件夹  
    ///   
    /// 要压缩的文件夹路径  
    /// 压缩文件完整路径  
    /// 是否压缩成功  
    public bool ZipDirectory(string folderToZip, string zipedFile)
    {
      bool result = ZipDirectory(folderToZip, zipedFile, null);
      return result;
    }
    ///   
    /// 压缩文件  
    ///   
    /// 要压缩的文件全名  
    /// 压缩后的文件名  
    /// 密码  
    /// 压缩结果  
    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;
    }
    ///   
    /// 压缩文件  
    ///   
    /// 要压缩的文件全名  
    /// 压缩后的文件名  
    /// 压缩结果  
    public bool ZipFile(string fileToZip, string zipedFile)
    {
      bool result = ZipFile(fileToZip, zipedFile, null);
      return result;
    }
    ///   
    /// 压缩文件或文件夹  
    ///   
    /// 要压缩的路径  
    /// 压缩后的文件名  
    /// 密码  
    /// 压缩结果  
    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;
    }
    ///   
    /// 压缩文件或文件夹  
    ///   
    /// 要压缩的路径  
    /// 压缩后的文件名  
    /// 压缩结果  
    public bool Zip(string fileToZip, string zipedFile)
    {
      bool result = Zip(fileToZip, zipedFile, null);
      return result;
    }
    #endregion
    #region 解压 
    ///   
    /// 解压功能(解压压缩文件到指定目录)  
    ///   
    /// 待解压的文件  
    /// 指定解压目标目录  
    /// 密码  
    /// 解压结果  
    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;
    }
    ///   
    /// 解压功能(解压压缩文件到指定目录)  
    ///   
    /// 待解压的文件  
    /// 指定解压目标目录  
    /// 解压结果  
    public bool UnZip(string fileToUnZip, string zipedFolder)
    {
      bool result = UnZip(fileToUnZip, zipedFolder, null);
      return result;
    }
    #endregion
  }
}

备注

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

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

总结

以上所述是小编给大家介绍的C# 使用SharpZipLib生成压缩包的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/122817.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号