热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#实现文件的压缩与解压

2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、准备工作

 

1、下载 ICSharpCode.SharpZipLib.dll 文件

2、项目中引用这个dll

 

 

二、文件压缩与解压共用类

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;namespace ZIPUtilities
{/**

/// Zip压缩帮助类/// public class ZipHelper{/** /// 压缩文件夹/// /// /// /// 压缩率0(无压缩)9(压缩率最高)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);}}}/** /// 获取所有文件 /// /// 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;}/** /// 获取一个文件夹下的所有文件夹里的文件 /// /// /// public void GetAllDirsFiles(IEnumerable dirs, Hashtable filesList){foreach (DirectoryInfo dir in dirs){foreach (FileInfo file in dir.GetFiles("*.*")){filesList.Add(file.FullName, file.LastWriteTime);}GetAllDirsFiles(dir.GetDirectories(), filesList);}}/** /// 获取一个文件夹下的文件 /// /// 目录名称/// 文件列表HastTable public static void GetAllDirFiles(DirectoryInfo dir, Hashtable filesList){foreach (FileInfo file in dir.GetFiles("*.*")){filesList.Add(file.FullName, file.LastWriteTime);}}/** /// 功能:解压zip格式的文件。 /// /// 压缩文件路径 /// 解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 /// 解压是否成功 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;}}}}}}}/** /// 压缩单个文件/// /// 被压缩的文件名称(包含文件路径),文件的全路径/// 压缩后的文件名称(包含文件路径),保存的文件名称/// 压缩率0(无压缩)到 9(压缩率最高)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 /// 压缩单个文件 /// /// 要进行压缩的文件名,全路径 /// 压缩后生成的压缩文件名,全路径 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();}}}}/** /// 压缩多个目录或文件/// /// 待压缩的文件夹或者文件,全路径格式,是一个集合/// 压缩后的文件名,全路径格式/// 压缩密码/// public bool ZipManyFilesOrDictorys(IEnumerable 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;}}/** /// 带压缩流压缩单个文件/// /// 要进行压缩的文件名/// /// 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;}/** /// 递归压缩文件夹方法/// /// /// /// 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;}}
}

 

参考资料:C#实现文件的压缩与解压  http://www.studyofnet.com/news/1244.html


转:https://my.oschina.net/u/2428791/blog/699406



推荐阅读
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • This post discusses an issue encountered while using the @name annotation in documentation generation, specifically regarding nested class processing and unexpected output. ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
author-avatar
允思顾我在
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有