C# 压缩、解压文件夹或文件(带密码)
今天梳理一下项目中用到的压缩、解压文件夹或文件的方法,发现因为需求不同,已经用了好几个不同组件。今天就好好整理记录下,别下次遇到需求又重头开始了。
DotNetZip
DotNetZip是一个开源的免费类库,主要提供了快速操作zip文件的工具集,VB、C#任何.Net语言都可以通过它创建、解压缩zip文件。我使用该类库最主要的目的还是因为它可以创建带密码保护的压缩文件。
只有设置了
zip.Password = "password"
之后,被压缩的文件才会有密码保护
/// <summary>
/// 压缩文件/文件夹
/// </summary>
/// <param name="filePath">需要压缩的文件/文件夹路径</param>
/// <param name="zipPath">压缩文件路径(zip后缀)</param>
/// <param name="password">密码</param>
/// <param name="filterExtenList">需要过滤的文件后缀名</param>
public static void CompressionFile(string filePath, string zipPath, string password = "", List<string> filterExtenList = null)
{
try
{
using (ZipFile zip = new ZipFile(Encoding.UTF8))
{
if (!string.IsNullOrWhiteSpace(password))
{
zip.Password = password;
}
if (Directory.Exists(filePath))
{
if (filterExtenList == null)
zip.AddDirectory(filePath);
else
AddDirectory(zip, filePath, filePath, filterExtenList);
}
else if (File.Exists(filePath))
{
zip.AddFile(filePath,"");
}
zip.Save(zipPath);
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 添加文件夹
/// </summary>
/// <param name="zip">ZipFile对象</param>
/// <param name="dirPath">需要压缩的文件夹路径</param>
/// <param name="rootPath">根目录路径</param>
/// <param name="filterExtenList">需要过滤的文件后缀名</param>
public static void AddDirectory(ZipFile zip, string dirPath, string rootPath, List<string> filterExtenList)
{
var files = Directory.GetFiles(dirPath);
for (int i = 0; i < files.Length; i++)
{
//如果Contains不支持第二个参数,就用.ToLower()
if (filterExtenList == null || (filterExtenList != null && !filterExtenList.Any(d => Path.GetExtension(files[i]).Contains(d, StringComparison.OrdinalIgnoreCase))))
{
//获取相对路径作为zip文件中目录路径
zip.AddFile(files[i], Path.GetRelativePath(rootPath, dirPath));
//如果没有Path.GetRelativePath方法,可以用下面代码替换
//string relativePath = Path.GetFullPath(dirPath).Replace(Path.GetFullPath(rootPath), "");
//zip.AddFile(files[i], relativePath);
}
}
var dirs = Directory.GetDirectories(dirPath);
for (int i = 0; i < dirs.Length; i++)
{
AddDirectory(zip, dirs[i], rootPath, filterExtenList);
}
}
SharpCompress
SharpCompress是用到现在,感觉功能最强大的压缩、解压开源插件。它支持处理zip、rar、7z等多种格式的压缩文件,使用方式也很简单。当然,最让我难受的是创建压缩文件的时候没法设置密码~所以才有了上面DotnetZip的代码。
SharpCompress版本不同,设置ArchiveEncoding的方式也不同,默认设置了UTF8防止解压乱码。
通过设置ArchiveType切换生成不同格式压缩文件
/// <summary>
/// 压缩文件/文件夹
/// </summary>
/// <param name="filePath">需要压缩的文件/文件夹路径</param>
/// <param name="zipPath">压缩文件路径(zip后缀)</param>
/// <param name="filterExtenList">需要过滤的文件后缀名</param>
public static void CompressionFile(string filePath, string zipPath, List<string> filterExtenList = null)
{
try
{
using (var zip = File.Create(zipPath))
{
var option = new WriterOptions(CompressionType.Deflate)
{
ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding()
{
Default = Encoding.UTF8
}
};
using (var zipWriter = WriterFactory.Open(zip, ArchiveType.Zip, option))
{
if (Directory.Exists(filePath))
{
//添加文件夹
zipWriter.WriteAll(filePath, "*",
(path) => filterExtenList == null ? true : !filterExtenList.Any(d => Path.GetExtension(path).Contains(d, StringComparison.OrdinalIgnoreCase)), SearchOption.AllDirectories);
}
else if (File.Exists(filePath))
{
zipWriter.Write(Path.GetFileName(filePath), filePath);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 解压文件
/// </summary>
/// <param name="zipPath">压缩文件路径</param>
/// <param name="dirPath">解压到文件夹路径</param>
/// <param name="password">密码</param>
public static void DeCompressionFile(string zipPath, string dirPath, string password = "")
{
if (!File.Exists(zipPath))
{
throw new ArgumentNullException("zipPath压缩文件不存在");
}
Directory.CreateDirectory(dirPath);
try
{
using (Stream stream = File.OpenRead(zipPath))
{
var option = new ReaderOptions()
{
ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding()
{
Default = Encoding.UTF8
}
};
if (!string.IsNullOrWhiteSpace(password))
{
option.Password = password;
}
var reader = ReaderFactory.Open(stream, option);
while (reader.MoveToNextEntry())
{
if (reader.Entry.IsDirectory)
{
Directory.CreateDirectory(Path.Combine(dirPath, reader.Entry.Key));
}
else
{
//创建父级目录,防止Entry文件,解压时由于目录不存在报异常
var file = Path.Combine(dirPath, reader.Entry.Key);
Directory.CreateDirectory(Path.GetDirectoryName(file));
reader.WriteEntryToFile(file);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
总结
相似的插件还有SharpZipLib(支持更多的压缩格式)、SevenZipSharp(专注处理7z格式压缩文件)等,它们也都有各自的优缺点。但总的来说,上面的两个组件已经满足日常工作中的大部分需求,遇到相同问题的朋友可以参考下~
C# 压缩、解压文件夹或文件(带密码)的更多相关文章
- Linux压缩解压 tar.gz格式的文件.查看tomcat是否运行
tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...
- 【转载】.NET压缩/解压文件/夹组件
转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...
- linux查看文件夹大小,备份文件夹zip压缩解压
linux查看文件夹大小,备份文件夹zip压缩解压 du -sh : 查看当前目录总共占的容量.而不单独列出各子项占用的容量 du -lh --max-depth=1 : 查看当前目录下一级子文件和子 ...
- .NET使用ICSharpCode.SharpZipLib压缩/解压文件
SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...
- huffman压缩解压文件【代码】
距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug.其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自 ...
- 【.Net Core】ZipFile类--文件的压缩解压
NuGet引用官网自带的System.IO.Compression.ZipFile; var filename = "测试压缩解压文件"; var path = Directory ...
- (转载)C#压缩解压zip 文件
转载之: C#压缩解压zip 文件 - 大气象 - 博客园http://www.cnblogs.com/greatverve/archive/2011/12/27/csharp-zip.html C# ...
- tar 解压某个指定的文件或者文件夹
1. 先查看压缩文档中有那些文件,如果都不清楚文件内容,然后就直接解压,这个是不可能的 使用#tar -tf 压缩包名称,可以查看压缩包内容 2.解压某个文件 tar -zxvf zabbix.tar ...
- JAVA压缩解压ZIP文件,中文乱码还需要ANT.JAR包
package zip; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStrea ...
随机推荐
- 二维线段树->树套树
现在上真正的二维线段树 毕竟 刚刚那个是卡常 过题我们现在做一个更高级的做法二维线段树. 大体上维护一颗x轴线段树 然后在每个节点的下方再吊一颗维护y轴的线段树那么此时我们整个平面就被我们玩好了. 这 ...
- PHP开发者该知道的多进程消费队列
引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了… 这种方式每次都要修改crontab,如果进程挂掉了,不会 ...
- cobbler多机定制安装
目录 cobbler多机定制安装 1. cobbler服务端部署 2. 客户端安装 3. 定制安装配置 4. 安装 client1开机 client2开机 cobbler多机定制安装 1. cobbl ...
- 利用python进行数据分析PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:hi2j 内容简介 [名人推荐] "科学计算和数据分析社区已经等待这本书很多年了:大量具体的实践建议,以及大量综合应用方法.本书在未来几年里肯定会成为Python领域中技术计 ...
- SpringCloud生产消费者
SpringCloud生产消费者 生产者与消费者 上一篇文章介绍了Euarka的搭建,SpringCloud服务注册中心 本篇文章,我们搭建俩个服务,生产者服务与消费者服务. 本文就以电商系统为例:服 ...
- 简单配置iOS的通用链接,迅速解决“universal link 校验不通过”问题!
对于需要使用微信支付等功能的APP来说,对接微信提供的openSDK是不可缺少的一环.随着苹果iOS 13系统版本的安全升级,为此openSDK在1.8.6版本进行了适配.1.8.6之后的openSD ...
- C++文件操作和模板
1.数据层次 位 bit 字节 byte 域/记录 将所有记录顺序地写入一个文件---->顺序文件:一个有限字符构成的顺序字符流 C++标准库中:ifsteam,ofstream,fstream ...
- yum自建离线仓库
1.步骤 centOS的安装包,完整版最好--everyhing版本 解压缩 将文件夹内Packages文件导入系统 执行命令如下: 1. mv ./Packages/ /mnt/ 2. create ...
- Linux下 flash工具的使用
使用命令前用cat /proc/mtd 查看一下mtdchar字符设备:或者用ls -l /dev/mtd* #cat /proc/mtd dev: size erasesize name ...
- java Eclipse刷新报错 Feature 'taglib' not found.
刷新工程报错:org.eclipse.emf.ecore.xmi.FeatureNotFoundException: Feature 'taglib' not found. 错误原因:tomcat7, ...