SharpZipLib 文件/文件夹压缩
一、ZipFile
ZipFile类用于选择文件或文件夹进行压缩生成压缩包。
常用属性:
属性 | 说明 |
Count | 文件数目(注意是在ComitUpdat之后才有) |
Password | 压缩包密码 |
Size | 压缩包占用空间大小 |
Name | 压缩包名称,默认输出是文件路径 |
ZipEntry | 压缩包里的文件,通过索引[]访问 |
其常用方法如下:
方法 | 说明 |
Add | 添加要进行压缩的文件 |
AddDirectory | 添加文件夹(不会压缩文件夹里的文件) |
Delete | 删除文件或文件夹 |
BeginUpdate | 开始修改压缩包 |
CommitUpdate | 提交修改 |
SetComment | 添加注释 |
示例1(创建压缩文件):
using (ZipFile zip = ZipFile.Create(@"D:\test.zip"))
{
zip.BeginUpdate();
zip.SetComment("这是我的压缩包");
zip.Add(@"D:\1.txt"); //添加一个文件
zip.AddDirectory(@"D:\2"); //添加一个文件夹(这个方法不会压缩文件夹里的文件)
zip.Add(@"D:\2\2.txt"); //添加文件夹里的文件
zip.CommitUpdate();
}
这样生成的压缩包是包含子文件夹,子文件夹也是包含子文件的。
其中,注释如下:
示例2:修改压缩包
using (ZipFile zip = new ZipFile(@"D:\test.zip"))
{
zip.BeginUpdate();
zip.Add(@"D:\2.txt");
zip.CommitUpdate();
}
留意这个示例和上面的有什么不同,上面的是Create方法创建的ZipFile对象,而这里是直接读。因此,如果压缩包里面有文件,则不会改动原来的压缩文件,而是往会里面添加一个。这样就相当于压缩包的修改,而上面是压缩包的创建。
示例3:读取压缩包里的文件:
using (ZipFile zip = new ZipFile(@"D:\test.zip"))
{
foreach (ZipEntry z in zip)
{
Console.WriteLine(z);
}
ZipEntry z1 = zip[];
Console.WriteLine(z1.Name);
}
二、FastZip
这个类就两个方法:
方法 | 说明 |
CreateZip | 压缩目录 |
ExtractZip | 解压缩目录 |
1、FastZip用于快速压缩目录,示例如下:
//快速压缩目录,包括目录下的所有文件
(new FastZip()).CreateZip(@"D:\test.zip", @"D:\test\", true, "");
这个是递归压缩的。但是局限性就是只能压缩文件夹。
否则报如下错误:
2、快速解压缩目录
//快速解压
(new FastZip()).ExtractZip(@"D:\test.zip", @"D:\解压目录\", "");
三、ZipOutputStream与ZipEntry
- ZipOutputStream:相当于一个压缩包;
- ZipEntry:相当于压缩包里的一个文件;
以上两个类是SharpZipLib的主类,最耐玩的就是这两个类。
ZipOutputStream常用属性:
属性 | 说明 |
IsFinished | ZipOutputStream是否已结束 |
ZipOutputStream常用方法:
方法 | 说明 |
CloseEntry | 关闭入口,关闭之后不允许再对ZipOutputStream进行操作 |
Finish | 结束写入 |
GetLevel | 读取压缩等级 |
PutNextEntry | 往ZipOutputStream里写入一个ZipEntry |
SetComment | 压缩包的注释 |
SetLevel | 设置压缩等级,等级越高文件越小 |
Write | 写入文件内容 |
使用ZipOutputStream创建一个压缩包并往里面写入一个文件的示例:
static void Main(string[] args)
{
using (ZipOutputStream s = new ZipOutputStream(File.Create(@"D:\123.zip")))
{
s.SetLevel(); //设置压缩等级,等级越高压缩效果越明显,但占用CPU也会更多using (FileStream fs = File.OpenRead(@"D:\1.txt"))
{
byte[] buffer = new byte[ * ]; //缓冲区,每次操作大小
ZipEntry entry = new ZipEntry(Path.GetFileName(@"改名.txt")); //创建压缩包内的文件
entry.DateTime = DateTime.Now; //文件创建时间
s.PutNextEntry(entry); //将文件写入压缩包 int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, , buffer.Length); //读取文件内容(1次读4M,写4M)
s.Write(buffer, , sourceBytes); //将文件内容写入压缩相应的文件
} while (sourceBytes > );
}
s.CloseEntry();
} Console.ReadKey();
}
以上示例仅仅能够压缩文件,要压缩文件夹就要使用递归的方式,循环子目录并压缩子目录里的文件。
示例2:文件夹压缩,保持原文件夹架构:
class Program
{
static void Main(string[] args)
{
string Source = @"D:\test";
string TartgetFile = @"D:\test.zip";
Directory.CreateDirectory(Path.GetDirectoryName(TartgetFile));
using (ZipOutputStream s = new ZipOutputStream(File.Create(TartgetFile)))
{
s.SetLevel();
Compress(Source, s);
s.Finish();
s.Close();
} Console.ReadKey();
} /// <summary>
/// 压缩
/// </summary>
/// <param name="source">源目录</param>
/// <param name="s">ZipOutputStream对象</param>
public static void Compress(string source, ZipOutputStream s)
{
string[] filenames = Directory.GetFileSystemEntries(source);
foreach (string file in filenames)
{
if (Directory.Exists(file))
{
Compress(file, s); //递归压缩子文件夹
}
else
{
using (FileStream fs = File.OpenRead(file))
{
byte[] buffer = new byte[ * ];
ZipEntry entry = new ZipEntry(file.Replace(Path.GetPathRoot(file),"")); //此处去掉盘符,如D:\123\1.txt 去掉D:
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry); int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, , buffer.Length);
s.Write(buffer, , sourceBytes);
} while (sourceBytes > );
}
}
}
}
}
附上解压缩方法:
/// <summary>
/// 解压缩
/// </summary>
/// <param name="sourceFile">源文件</param>
/// <param name="targetPath">目标路经</param>
public bool Decompress(string sourceFile, string targetPath)
{
if (!File.Exists(sourceFile))
{
throw new FileNotFoundException(string.Format("未能找到文件 '{0}' ", sourceFile));
}
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourceFile)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directorName = Path.Combine(targetPath, Path.GetDirectoryName(theEntry.Name));
string fileName = Path.Combine(directorName, Path.GetFileName(theEntry.Name));
// 创建目录
if (directorName.Length > )
{
Directory.CreateDirectory(directorName);
}
if (fileName != string.Empty)
{
using (FileStream streamWriter = File.Create(fileName))
{
int size = ;
byte[] data = new byte[ * ];
while (true)
{
size = s.Read(data, , data.Length);
if (size > )
{
streamWriter.Write(data, , size);
}
else break;
}
}
}
}
}
return true;
}
ZipEntry就没什么好说的了,都是一些属性,指示一下,实际用到的很少。
框架地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
SharpZipLib 文件/文件夹压缩的更多相关文章
- C# 文件/文件夹压缩
一.ZipFile ZipFile类用于选择文件或文件夹进行压缩生成压缩包. 常用属性: 属性 说明 Count 文件数目(注意是在ComitUpdat之后才有) Password 压缩包密码 Siz ...
- C# 文件/文件夹压缩解压缩
项目上用到的,随手做个记录,哈哈. 直接上代码: using System; using System.Data; using System.Configuration; using System.C ...
- C# - WinFrm应用程序调用SharpZipLib实现文件的压缩和解压缩
前言 本篇主要记录:VS2019 WinFrm桌面应用程序调用SharpZipLib,实现文件的简单压缩和解压缩功能. SharpZipLib 开源地址戳这里. 准备工作 搭建WinFrm前台界面 添 ...
- C#文件或文件夹压缩和解压
C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压 1.新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSh ...
- SharpZipLib 文件/文件夹 过滤
这里就不说压缩/解压了.网上教程太多. 主要说一下,解压时,如何过滤某些文件/文件夹 参考地址:https://github.com/icsharpcode/SharpZipLib/wiki/Fast ...
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...
- 使用SharpZipLib实现文件压缩、解压
接口 public interface IUnZip { /// <summary> /// 功能:解压zip格式的文件. /// </summary> /// <par ...
- 在C#中利用SharpZipLib进行文件的压缩和解压缩收藏
我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipL ...
- linux压缩文件(夹) zip uzip命令的用法
压缩文件(夹) # 压缩列举的文件,格式如下: zip 压缩包名称 文件1 文件2 文件3 ... # 压缩test.txt, a.out文件,并取名为abc.zip $ zip abc.zip te ...
随机推荐
- Js变量定义——fn里 var与不var的区别
js运行时内置了一个Global对象. 这个Global对象跟运行环境有关.在浏览器运行环境中.Global就是window对象.在nodejs中.Global对象是global对象. 当你在浏览器环 ...
- HTTP协议 (二) 基本认证
HTTP协议 (二) 基本认证 http协议是无状态的, 浏览器和web服务器之间可以通过cookie来身份识别. 桌面应用程序(比如新浪桌面客户端, skydrive客户端)跟Web服务器之间是如何 ...
- bzoj1150: [CTSC2007]数据备份Backup--贪心+优先队列维护堆
题目大意:将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 之前向CZL大神学习了用堆来贪心的做法orz 大概思路就是将 ...
- $.getJSON JSONP的新坑
神坑1:返回的内容必须是正规的json数据.如 { "firstName": "Bill", "lastName": "Gates ...
- BizTalk开发系列(三十五) TCP/IP 适配器
BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...
- linux一些名词
硬链接: 同一个索引节点的两个文件 ln a b //创建a的连接文件b,删除a,不失效软连接: 不同索引节点,相当于一个快捷方式ln -s a b,删除a,b失效 网络协议: 网络协议就是通信规则的 ...
- php课程---面向对象
面向对象:一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao() { echo "{$this->n ...
- Linux搭建QT环境笔记
*** [../../../../lib/libQtWebKit.so.4.7.4] Error 1make[1]: Leaving directory `/home/cloverbox/qt-eve ...
- Ignoring Extra Elements in mongoDB C# Driver
MongoDB删除字段后会报错: Element ... does not match any field or property of class Customer. 需要在实体类增加 [BsonI ...
- 序列化(Serialization)据为JSONP远端请求
Insus.NET前些日子,有分享了一段代码,<使用JSONP跨域请求数据>http://www.cnblogs.com/insus/p/3512271.html 是使用jQuery的Da ...