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

(0)

相关推荐

  • C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩

    压缩包制作也是很多项目中需要用到的功能.比如有大量的文件(假设有10000个)需要上传,1个1个的上传似乎不太靠谱(靠,那得传到什么时候啊?),这时我们可以制作一个压缩包zip,直接传这个文件到服务器端,然后在服务器目录解压,释放里面的文件. 这里我们选用ICSharpCode.SharpZipLib这个类库来实现我们的需求. 下载地址:http://icsharpcode.github.io/SharpZipLib/ 该组件支持.NET 1.1, .NET 2.0 (3.5, 4.0), .N

  • C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能

    下面给大家介绍C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能,具体代码如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Checksums; using Syst

  • 基于C# 生成Zip压缩包代码

    压缩包制作也是很多项目中需要用到的功能.比如有大量的文件(假设有10000个)需要上传,1个1个的上传似乎不太靠谱(靠,那得传到什么时候啊?),这时我们可以制作一个压缩包zip,直接传这个文件到服务器端,然后在服务器目录解压,释放里面的文件. 这里我们选用ICSharpCode.SharpZipLib这个类库来实现我们的需求. ICSharpCode.SharpZipLib提供了两个压缩算法的实现,分别是BZIP2(压缩时间长,压缩率高)和GZIP(压缩效率高,压缩率低). 先定义一个枚举,用于

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

    本文通过一个简单的小例子简述SharpZipLib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正. 什么是SharpZipLib ? SharpZipLib是一个C#的类库,主要用来解压缩Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式实现,可以方便的应用于其他的项目之中. 在工程中引用SharpZipLib 在项目中,点击项目名称右键-->管理NuGet程序包,打开NuGet包管理器窗口,进行搜索下载即可,如下图所示: SharpZipLib的关键类结构图 如下所

  • jQuery实现可编辑表格并生成json结果(实例代码)

    实现效果如下,在编辑表格的同时可以实现字段json内容的自动变化,点击提交可以保存到后台,页面加载的时候自动解析json并加载表格内容.该代码解析和加载功能都用前端js实现,简化了后台代码逻辑. 定义要操作的表格头: <input readonly="readonly" class="form-control" type="text" id="scorerange" value="" name=&qu

  • Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_test.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja

  • java token生成和校验的实例代码

    现在越来越多的登录方式都用到了token作为用户登录令牌,所以实现了一个token生成和校验案例. 缺点:该实现方式token是存储在内存中,不适合分布式项目,如需改为分布式项目部署,可把token存储在redis中,其中的实现原理还是保持不变. 一)token编码工具类 package com.oysept.token.utils; /** * token编码工具类 * @author ouyangjun */ public class TokenEncryptUtils { // 编码密码,

  • python生成excel的实例代码

    本文实例为大家分享了python生成excel的具体代码,供大家参考,具体内容如下 #_*_coding:utf-8_*_ import MySQLdb import xlwt from datetime import datetime def get_data(sql): # 创建数据库连接. conn = MySQLdb.connect(host='127.0.0.1',user='root' ,passwd='123456',db='test',port=3306,charset='utf

  • php生成xml简单实例代码

    当处理基于XML应用程序时,开发者经常需要建立XML编码数据结构.例如,Web中基于用户输入的XML状态模板,服务器请求XML语句,以及基于运行时间参数的客户响应. 尽管XML数据结构的构建比较费时,但如果使用成熟的PHP DOM应用程序接口,一切都会变得简单明了.本文将向你介绍PHP DOM应用程序接口的主要功能,演示如何生成一个正确的XML完整文件并将其保存到磁盘中. 创建文档类型声明 一般而言,XML声明放在文档顶部.在PHP中声明十分简单:只需实例化一个DOM文档类的对象并赋予它一个版本

  • php生成txt文件实例代码介绍

    这是一个朋友过来的 php 生成 txt 文件代码,这只是一个实例,需要我来给他生成多个 txt 文件实例的,但我觉得他这个代码有点意思,所以就分享上来了. 先说下这个 php 生成 txt 文件代码都是什么功能吧,肯定是要生成 txt 文件的,有点废话了,不说其它的了,这个 php 代码可以生成指定目录下的一个 txt 文件,并在 txt 文件里面写入三行文字,这个是在 php 里面定义好的. 夏日博客分享下实例的代码如下: <!doctype html> <html> <

  • 利用Ext Js生成动态树实例代码

    一. 需求 要求生成一颗部门树,初始只列出根部门 当点击一个部门节点时,动态载入该部门下的直属子部门,并展开该部门节点 部门节点要求支持右键单击事件,当点击右键时,列出相关操作菜单 二. 关键类 这里主要涉及Ext JS的两个类: Ext.tree.TreeNode Ext.menu.Menu 相关API可以参考:http://extjs.com/deploy/ext/docs/ 三. 代码示例 1. 先看一下测试页面 复制代码 代码如下: <html> <head> <me

  • c#多图片上传并生成缩略图的实例代码

    前台代码: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="upload.aspx.cs" Inherits="upload" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&q

  • JQuery 动态生成Table表格实例代码

    JQuery动态生成Table表格 主要用到了JQuery中的append和appendto的方法,具体代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type&quo

随机推荐