通过ICSharpCode.SharpZipLib类库对zip文件进行压缩与解压

2024-01-03 21:58

本文主要是介绍通过ICSharpCode.SharpZipLib类库对zip文件进行压缩与解压,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;namespace DataDisplay.Utilities
{public class ZipHelper{#region 压缩/// <summary>   /// 递归压缩文件夹的内部方法   /// </summary>   /// <param name="folderToZip">要压缩的文件夹路径</param>   /// <param name="zipStream">压缩输出流</param>   /// <param name="parentFolderName">此文件夹的上级文件夹</param>   /// <returns></returns>   private static 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{ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/"));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(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + 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 static 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 static 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 static 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 static 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 static bool Zip(string fileToZip, string zipedFile, string password){bool result = false;if (Directory.Exists(fileToZip))result = ZipDirectory(fileToZip, zipedFile, password);else if (File.Exists(fileToZip))result = ZipFile(fileToZip, zipedFile, password);return result;}/// <summary>   /// 压缩文件或文件夹   /// </summary>   /// <param name="fileToZip">要压缩的路径</param>   /// <param name="zipedFile">压缩后的文件名</param>   /// <returns>压缩结果</returns>   public static bool Zip(string fileToZip, string zipedFile){bool result = Zip(fileToZip, zipedFile, null);return result;}#endregion#region 解压/// <summary>  /// 功能:解压zip格式的文件。  /// </summary>  /// <param name="zipFilePath">压缩文件路径</param>  /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>  /// <param name="err">出错信息</param>  /// <returns>解压是否成功</returns>  public bool UnZipFile(string zipFilePath, string unZipDir)// , out string err  {// err = "";  if (zipFilePath == string.Empty){//err = "压缩文件不能为空!";  return false;}if (!File.Exists(zipFilePath)){//err = "压缩文件不存在!";  return false;}//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹  if (unZipDir == string.Empty)unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));if (!unZipDir.EndsWith("\\"))unZipDir += "\\";if (!Directory.Exists(unZipDir))Directory.CreateDirectory(unZipDir);try{using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath.ToLower()))){ZipEntry theEntry;while ((theEntry = s.GetNextEntry()) != null){string directoryName = Path.GetDirectoryName(theEntry.Name);string fileName = Path.GetFileName(theEntry.Name);if (directoryName.Length > 0){Directory.CreateDirectory(unZipDir + directoryName);}if (!directoryName.EndsWith("\\"))directoryName += "\\";if (fileName != String.Empty){using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)){int size = 2048;byte[] data = new byte[2048];while (true){size = s.Read(data, 0, data.Length);if (size > 0){streamWriter.Write(data, 0, size);}else{break;}}}}}//while  }}catch (Exception ex){//err = ex.Message;  return false;}return true;}//解压结束  #endregion}
}

这篇关于通过ICSharpCode.SharpZipLib类库对zip文件进行压缩与解压的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567179

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Python脚本:对文件进行批量重命名

字符替换:批量对文件名中指定字符进行替换添加前缀:批量向原文件名添加前缀添加后缀:批量向原文件名添加后缀 import osdef Rename_CharReplace():#对文件名中某字符进行替换(已完结)re_dir = os.getcwd()re_list = os.listdir(re_dir)original_char = input('请输入你要替换的字符:')replace_ch

Python脚本:批量解压RAR文件

所需模块: os.getcwd() #获取脚本文件路径os.system() #执行系统命令 import os#source_dir = input("Please input in source_dir:")#unzip_dir = input("Please input in unzip_dir:") source_dir = os.

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m