• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中ZipHelper 压缩和解压帮助类

C#中ZipHelper 压缩和解压帮助类

作者:杨恒连 字体:[增加 减小] 来源:互联网 时间:2017-05-28

杨恒连 通过本文主要向大家介绍了马桶c的个人空间,c语言,欲情 c max,维生素c,奔驰c200等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

关于本文档的说明

  本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的

  欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利。

  本人自从几年前走上编程之路,一直致力于收集和总结出好用的框架和通用类库,不管是微软自己的还是第三方的只要实际项目中好用且可以解决实际问题那都会收集好,编写好文章和别人一起分享,这样自己学到了,别人也能学到知识,当今社会很需要知识的搬运工。

1.基本介绍

      由于项目中需要用到各种压缩将文件进行压缩下载,减少网络的带宽,所以压缩是一个非常常见的功能,对于压缩微软自己也提供了一些类库

微软自带压缩类ZipArchive类,适合NET FrameWork4.5才可以使用
调用压缩软件命令执行压缩动作,这个就需要电脑本身安装压缩软件了
使用第三方的压缩dll文件,一般使用最多的是(ICSharpCode.SharpZipLib.dll),下载dll ICSharpCode.SharpZipLib.zip

2.实际项目

压缩单个文件,需要指定压缩等级
压缩单个文件夹,需要指定压缩等级
压缩多个文件或者多个文件夹
对压缩包进行加密【用的较少,实际情况也有】

2.1 压缩单个文件

写了两个方法,可以指定压缩等级,这样你的压缩包大小就不一样了

2.2 压缩单个文件夹

public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)
</div>

2.3 压缩多个文件或者文件夹

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)
</div>

2.4 对压缩包进行加密

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)
</div>

2.5 直接解压,无需密码

public void UnZip(string zipFilePath, string unZipDir)


</div>

3.演示图 

 

3.ZipHelper源码

//-------------------------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2016 , ZTO , Ltd .
//-------------------------------------------------------------------------------------

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace ZTO.PicTest.Utilities
{
  using ICSharpCode.SharpZipLib.Checksums;
  using ICSharpCode.SharpZipLib.Zip;

  /// <summary>
  /// Zip压缩帮助类
  ///
  /// 修改纪录
  ///
  ///    2015-09-16 版本:1.0 YangHengLian 创建主键,注意命名空间的排序。
  ///   2016-5-7 YangHengLian增加了可以支持多个文件或者多个文件夹打包成一个zip文件
  /// 
  /// 版本:1.0
  ///
  /// <author>
  ///    <name>YangHengLian</name>
  ///    <date>2015-09-16</date>
  /// </author>
  /// </summary>
  public class ZipHelper
  {
    /// <summary>
    /// 压缩文件夹
    /// </summary>
    /// <param name="dirToZip"></param>
    /// <param name="zipedFileName"></param>
    /// <param name="compressionLevel">压缩率0(无压缩)9(压缩率最高)</param>
    public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)
    {
      if (Path.GetExtension(zipedFileName) != ".zip")
      {
        zipedFileName = zipedFileName + ".zip";
      }
      using (var zipoutputstream = new ZipOutputStream(File.Create(zipedFileName)))
      {
        zipoutputstream.SetLevel(compressionLevel);
        Crc32 crc = new Crc32();
        Hashtable fileList = GetAllFies(dirToZip);
        foreach (DictionaryEntry item in fileList)
        {
          FileStream fs = new FileStream(item.Key.ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
          byte[] buffer = new byte[fs.Length];
          fs.Read(buffer, 0, buffer.Length);
          // ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(dirToZip.Length + 1));
          ZipEntry entry = new ZipEntry(Path.GetFileName(item.Key.ToString()))
                   {
                     DateTime = (DateTime) item.Value,
                     Size = fs.Length
                   };
          fs.Close();
          crc.Reset();
          crc.Update(buffer);
          entry.Crc = crc.Value;
          zipoutputstream.PutNextEntry(entry);
          zipoutputstream.Write(buffer, 0, buffer.Length);
        }
      }
    }

    /// <summary> 
    /// 获取所有文件 
    /// </summary> 
    /// <returns></returns> 
    public Hashtable GetAllFies(string dir)
    {
      Hashtable filesList = new Hashtable();
      DirectoryInfo fileDire = new DirectoryInfo(dir);
      if (!fileDire.Exists)
      {
        throw new FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
      }

      GetAllDirFiles(fileDire, filesList);
      GetAllDirsFiles(fileDire.GetDirectories(), filesList);
      return filesList;
    }

    /// <summary> 
    /// 获取一个文件夹下的所有文件夹里的文件 
    /// </summary> 
    /// <param name="dirs"></param> 
    /// <param name="filesList"></param> 
    public void GetAllDirsFiles(IEnumerable<DirectoryInfo> dirs, Hashtable filesList)
    {
      foreach (DirectoryInfo dir in dirs)
      {
        foreach (FileInfo file in dir.GetFiles("*.*"))
        {
          filesList.Add(file.FullName, file.LastWriteTime);
        }
        GetAllDirsFiles(dir.GetDirectories(), filesList);
      }
    }

    /// <summary> 
    /// 获取一个文件夹下的文件 
    /// </summary> 
    /// <param name="dir">目录名称</param>
    /// <param name="filesList">文件列表HastTable</param> 
    public static void GetAllDirFiles(DirectoryInfo dir, Hashtable filesList)
    {
      foreach (FileInfo file in dir.GetFiles("*.*"))
      {
        filesList.Add(file.FullName, file.LastWriteTime);
      }
    }

    /// <summary> 
    /// 功能:解压zip格式的文件。 
    /// </summary> 
    /// <param name="zipFilePath">压缩文件路径</param> 
    /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param> 
    /// <returns>解压是否成功</returns> 
    public void UnZip(string zipFilePath, string unZipDir)
    {
      if (zipFilePath == string.Empty)
      {
        throw new Exception("压缩文件不能为空!");
      }
      if (!File.Exists(zipFilePath))
      {
        throw new FileNotFoundException("压缩文件不存在!");
      }
      //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 
      if (unZipDir == string.Empty)
        unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
      if (!unZipDir.EndsWith("/"))
        unZipDir += "/";
      if (!Directory.Exists(unZipDir))
        Directory.



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#利用ReportViewer生成报表
  • C#基于正则去掉注释的方法示例
  • C#中new的用法及与override的区别分析
  • C#实现两个richtextbox控件滚动条同步滚动的简单方法
  • C# for循环的经典案例集锦
  • C#操作word的方法示例
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法
  • C# WinForm制作异形窗体与控件的方法
  • C#实现Excel表数据导入Sql Server数据库中的方法
  • C#使用NPOI上传excel

相关文章

  • 2017-05-28c#值类型和引用类型使用示例
  • 2017-05-28C#中datatable序列化与反序列化实例分析
  • 2017-05-28C#找出字符串中第一个字母并大写的方法
  • 2017-05-28Winform实现调用asp.net数据接口实例
  • 2017-05-28C#查找对象在ArrayList中出现位置的方法
  • 2017-05-28C#拼图游戏编写代码(2)
  • 2017-05-28winform实现拖动文件到窗体上的方法
  • 2017-05-28C#特性 扩展方法
  • 2017-05-28C#Url操作类封装、仿Node.Js中的Url模块实例
  • 2017-05-28c# DevExpress gridcontrol日期行的显示格式设置

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法
    • C#利用时间和随即字符串创建唯一的订单编号
    • c#得到本月有几周和这几周的起止时间示例代码
    • 深入理解C#中new、override、virtual关键字的区别
    • C#数字图象处理之图像灰度化方法
    • C#实现线程安全的简易日志记录方法
    • c#3.0实现延迟赋值示例
    • C#中的多线程多参数传递详解
    • DevExpress TreeList 常见问题解决方法
    • c#创建windows服务入门教程实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有