关于本文档的说明

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

1.基本介绍

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

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

本文使用的正是ICSharpCode.SharpZipLib.dll相关的dll,ZipArchive相关的压缩和解压缩,后续会慢慢补上的。

2.实际项目

  1. 压缩单个文件,需要指定压缩等级
  2. 压缩单个文件夹,需要指定压缩等级
  3. 压缩多个文件或者多个文件夹
  4. 对压缩包进行加密【用的较少,实际情况也有】
  5. 直接解压,无需密码
  6. 需要密码解压

2.1 压缩单个文件

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

2.2 压缩单个文件夹

public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)

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

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

2.4 对压缩包进行加密

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

2.5 直接解压,无需密码

public void UnZip(string zipFilePath, string unZipDir)

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.CreateDirectory(unZipDir);using (var s = new ZipInputStream(File.OpenRead(zipFilePath))){ZipEntry theEntry;while ((theEntry = s.GetNextEntry()) != null){string directoryName = Path.GetDirectoryName(theEntry.Name);string fileName = Path.GetFileName(theEntry.Name);if (!string.IsNullOrEmpty(directoryName)){Directory.CreateDirectory(unZipDir + directoryName);}if (directoryName != null && !directoryName.EndsWith("/")){}if (fileName != String.Empty){using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)){int size;byte[] data = new byte[2048];while (true){size = s.Read(data, 0, data.Length);if (size > 0){streamWriter.Write(data, 0, size);}else{break;}}}}}}}/// <summary>/// 压缩单个文件/// </summary>/// <param name="filePath">被压缩的文件名称(包含文件路径),文件的全路径</param>/// <param name="zipedFileName">压缩后的文件名称(包含文件路径),保存的文件名称</param>/// <param name="compressionLevel">压缩率0(无压缩)到 9(压缩率最高)</param>public void ZipFile(string filePath, string zipedFileName, int compressionLevel = 9){// 如果文件没有找到,则报错 if (!File.Exists(filePath)){throw new FileNotFoundException("文件:" + filePath + "没有找到!");}// 如果压缩后名字为空就默认使用源文件名称作为压缩文件名称if (string.IsNullOrEmpty(zipedFileName)){string oldValue = Path.GetFileName(filePath);if (oldValue != null){zipedFileName = filePath.Replace(oldValue, "") + Path.GetFileNameWithoutExtension(filePath) + ".zip";}}// 如果压缩后的文件名称后缀名不是zip,就是加上zip,防止是一个乱码文件if (Path.GetExtension(zipedFileName) != ".zip"){zipedFileName = zipedFileName + ".zip";}// 如果指定位置目录不存在,创建该目录  C:\Users\yhl\Desktop\大汉三通string zipedDir = zipedFileName.Substring(0, zipedFileName.LastIndexOf("\\", StringComparison.Ordinal));if (!Directory.Exists(zipedDir)){Directory.CreateDirectory(zipedDir);}// 被压缩文件名称string filename = filePath.Substring(filePath.LastIndexOf("\\", StringComparison.Ordinal) + 1);var streamToZip = new FileStream(filePath, FileMode.Open, FileAccess.Read);var zipFile = File.Create(zipedFileName);var zipStream = new ZipOutputStream(zipFile);var zipEntry = new ZipEntry(filename);zipStream.PutNextEntry(zipEntry);zipStream.SetLevel(compressionLevel);var buffer = new byte[2048];Int32 size = streamToZip.Read(buffer, 0, buffer.Length);zipStream.Write(buffer, 0, size);try{while (size < streamToZip.Length){int sizeRead = streamToZip.Read(buffer, 0, buffer.Length);zipStream.Write(buffer, 0, sizeRead);size += sizeRead;}}finally{zipStream.Finish();zipStream.Close();streamToZip.Close();}}/// <summary> /// 压缩单个文件 /// </summary> /// <param name="fileToZip">要进行压缩的文件名,全路径</param> /// <param name="zipedFile">压缩后生成的压缩文件名,全路径</param> public void ZipFile(string fileToZip, string zipedFile){// 如果文件没有找到,则报错 if (!File.Exists(fileToZip)){throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");}using (FileStream fileStream = File.OpenRead(fileToZip)){byte[] buffer = new byte[fileStream.Length];fileStream.Read(buffer, 0, buffer.Length);fileStream.Close();using (FileStream zipFile = File.Create(zipedFile)){using (ZipOutputStream zipOutputStream = new ZipOutputStream(zipFile)){// string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);string fileName = Path.GetFileName(fileToZip);var zipEntry = new ZipEntry(fileName){DateTime = DateTime.Now,IsUnicodeText = true};zipOutputStream.PutNextEntry(zipEntry);zipOutputStream.SetLevel(5);zipOutputStream.Write(buffer, 0, buffer.Length);zipOutputStream.Finish();zipOutputStream.Close();}}}}/// <summary>/// 压缩多个目录或文件/// </summary>/// <param name="folderOrFileList">待压缩的文件夹或者文件,全路径格式,是一个集合</param>/// <param name="zipedFile">压缩后的文件名,全路径格式</param>/// <param name="password">压宿密码</param>/// <returns></returns>public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password){bool res = true;using (var s = new ZipOutputStream(File.Create(zipedFile))){s.SetLevel(6);if (!string.IsNullOrEmpty(password)){s.Password = password;}foreach (string fileOrDir in folderOrFileList){//是文件夹if (Directory.Exists(fileOrDir)){res = ZipFileDictory(fileOrDir, s, "");}else{//文件res = ZipFileWithStream(fileOrDir, s);}}s.Finish();s.Close();return res;}}/// <summary>/// 带压缩流压缩单个文件/// </summary>/// <param name="fileToZip">要进行压缩的文件名</param>/// <param name="zipStream"></param>/// <returns></returns>private bool ZipFileWithStream(string fileToZip, ZipOutputStream zipStream){//如果文件没有找到,则报错if (!File.Exists(fileToZip)){throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");}//FileStream fs = null;FileStream zipFile = null;ZipEntry zipEntry = null;bool res = true;try{zipFile = File.OpenRead(fileToZip);byte[] buffer = new byte[zipFile.Length];zipFile.Read(buffer, 0, buffer.Length);zipFile.Close();zipEntry = new ZipEntry(Path.GetFileName(fileToZip));zipStream.PutNextEntry(zipEntry);zipStream.Write(buffer, 0, buffer.Length);}catch{res = false;}finally{if (zipEntry != null){}if (zipFile != null){zipFile.Close();}GC.Collect();GC.Collect(1);}return res;}/// <summary>/// 递归压缩文件夹方法/// </summary>/// <param name="folderToZip"></param>/// <param name="s"></param>/// <param name="parentFolderName"></param>private bool ZipFileDictory(string folderToZip, ZipOutputStream s, string parentFolderName){bool res = true;ZipEntry entry = null;FileStream fs = null;Crc32 crc = new Crc32();try{//创建当前文件夹entry = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/")); //加上 “/” 才会当成是文件夹创建
                s.PutNextEntry(entry);s.Flush();//先压缩文件,再递归压缩文件夹var filenames = Directory.GetFiles(folderToZip);foreach (string file in filenames){//打开压缩文件fs = File.OpenRead(file);byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);entry = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)));entry.DateTime = DateTime.Now;entry.Size = fs.Length;fs.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);}}catch{res = false;}finally{if (fs != null){fs.Close();}if (entry != null){}GC.Collect();GC.Collect(1);}var folders = Directory.GetDirectories(folderToZip);foreach (string folder in folders){if (!ZipFileDictory(folder, s, Path.Combine(parentFolderName, Path.GetFileName(folderToZip)))){return false;}}return res;}}
}

ZipHelper

出处:https://www.cnblogs.com/weixing/p/5478845.html

转载于:https://www.cnblogs.com/mq0036/p/10522694.html

C# ZipHelper C#公共类 -- ICSharpCode.SharpZipLib.dll实现压缩和解压相关推荐

  1. C# 利用ICSharpCode.SharpZipLib.dll 实现压缩和解压缩文件

    我们 开发时经常会遇到需要压缩文件的需求,利用C#的开源组件ICSharpCode.SharpZipLib, 就可以很容易的实现压缩和解压缩功能. 压缩文件: /// <summary> ...

  2. ICSharpCode.SharpZipLib.dll,MyZip.dll,Ionic.Zip.dll 使用

    MyZip.dll : 有BUG,会把子目录的文件解压到根目录.. ICSharpCode.SharpZipLib.dll: 把ICSharpCode.SharpZipLib.dll复制一份,重命名为 ...

  3. zip (ICSharpCode.SharpZipLib.dll文件需要下载)

    ZipClass zc=new ZipClass (); zc.ZipDir(@"E:\1\新建文件夹", @"E:\1\新建文件夹.zip", 1);//压缩 ...

  4. 使用ICSharpCode.SharpZipLib.dll实现在线解压缩

    ICSharpCode.SharpZipLib.dll 是一个基于GNU的免费库文件,他的功能很强大. 下载地址:http://www.icsharpcode.net/OpenSource/Sharp ...

  5. linux 压缩 日期,Linux 时间日期类、搜索查找类、 压缩和解压类指令

    l 时间日期类 date指令-显示当前日期 基本语法 1) date (功能描述:显示当前时间) 2) date +%Y (功能描述:显示当前年份) 3) date +%m (功能描述:显示当前月份) ...

  6. 用SharpZipLib来压缩和解压文件 --zt

    from:http://www.cnblogs.com/zhangweiguo3984/archive/2007/03/15/314333.html#675634 1.建立工程,添加引用,添加Shar ...

  7. C#利用ICSharpCode.SharpZipLib.dll压缩文件和解压文件

    /// <summary>  /// 压缩文件  /// </summary> using System; using System.IO; using ICSharpCode ...

  8. C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件

    大家可以到http://www.icsharpcode.net/opensource/sharpziplib/ 下载SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, ...

  9. 20190923-08Linux压缩和解压类 000 016

    gzip/gunzip 压缩 1.基本语法 gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz文件) gunzip 文件.gz (功能描述:解压缩文件命令) 2.经验技巧 (1)只能压缩文 ...

最新文章

  1. Depends, python2.7-minimal (= 2.7.15_rc1-1) 问题解决方法使用 aptitude 安装以及与 apt-get 的区别
  2. windows环境下bat和python调用rysnc的方式
  3. 树莓派的九周年: 9 件事你可能不知道
  4. windows 仍在设置此设备的类配置。 (代码 56)_谷歌发布Flutter Alpha:支持Windows
  5. redhat bash: yum: 未找到命令..._常用linux yum 命令和 vim命令,这几个要熟记
  6. sql数据表改为自动递增显示与其他表关联_MySQL萌新第一季 第四话-数据表的基本操作...
  7. 如果战斗机飞行员弹出,自动驾驶仪会接管飞机安全降落么?
  8. elipse手机设备显示Target unknown解决方法
  9. XMPP即时通讯协议使用(十)——好友关系状态
  10. python网络爬虫之淘宝订单提取
  11. miniGUI源码分析:初始化
  12. FIR.im的使用_亲自实验
  13. 橱柜高度与身高对照表_橱柜高度与身高对照表 橱柜高度怎么根据身高定制?...
  14. Android 中文API合集 最终版,androi中文api合集.doc
  15. Maven - 5、私服详解
  16. day13_下 Class中三大护法 及常用属性 单例模式(扩展)
  17. 【Matlab身份证识别】身份证号码识别【含GUI源码 014期】
  18. “东数西算”超级工程上马,利好云计算但暗藏汹涌
  19. CentOS7卸载及安装MySQL5.7
  20. 使用Hash Table高速破解无线密码

热门文章

  1. 前端优化方案-JavaScript 优化方案 收藏 此文于2010-06-04被推荐到CSDN首页
  2. StringCollection FAQ [C#, BCL]
  3. Go Embed简明教程
  4. 【CyberSecurityLearning 78】DC系列之DC-9渗透测试
  5. 问题解决:无法获得锁 /var/lib/dpkg/lock
  6. android客户端证书到期了,在Android设备上生成客户端证书
  7. es java api 创建索引结构_elasticsearch - 如何使用ES的Java API来创建一个新类型的索引 - SO中文参考 - www.soinside.com...
  8. Android动态日志系统Holmes
  9. 在Android Native层中创建Java虚拟机实例
  10. Android6.0源码分析—— Zygote进程分析(补充)