.NET 4.5 中新提供的压缩类
Windows8 的开发已经如火如荼开始了,在 Windows8 中提供的 .NET Framework 已经更新到了 4.5 版,其中又增加了一些新的特性,对压缩文件的支持就是其中之一。
在 4.5 之前,处理压缩文件,我们经常需要使用第三方的类库 SharpZipLib, 现在可以直接实现了。
1.准备工作
首先做一下准备工作,需要确保你使用 .NET 4.5 版,可以在项目的属性窗口中检查一下。
然后,引用必须的程序集。
程序集有两个:System.IO.Compression 和 System.IO.Compression.FileSystem.
类似于对文件和目录的操作,对于压缩文件也提供了两种方式:ZipArchive 和 ZipFile,分别对应两个新增加的类 ZipArchive 和 ZipFile。这两个类都定义在命名空间 System.IO.Compression 中。
为了后面演示方便,我们定义一个表示压缩文件路径的常量。
- const string zipFilePath = @"..\..\Sample.zip";
2. 使用 ZipArchive
先看ZipArchive的使用。
2.1 创建压缩文件
创建一个空的压缩文件,使用 ZipArchiveMode.Create 创建参数。
- // 创建 Zip 文件
- using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
- using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
- {
- }
使用 WinRaR 打开压缩文件,可以看到里面没有文件。
2.2 创建并添加文件
通常,在创建的同时,我们就会加入一些文件,下面的例子中,我们将当前的执行程序文件本身加到压缩文件中。

- // 创建并添加被压缩文件
- using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
- using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
- {
- System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
- string path = assemble.Location;
- string filename = System.IO.Path.GetFileName(path);
- ZipArchiveEntry readMeEntry = archive.CreateEntry(filename);
- using (System.IO.Stream stream = readMeEntry.Open())
- {
- byte[] bytes = System.IO.File.ReadAllBytes(path);
- stream.Write(bytes, 0, bytes.Length);
- }
- }

现在,打开压缩文件,可以看到文件已经被压缩进来了。
2.3 列出压缩文件内容
当然,也可以通过程序检查压缩文件的内容了。使用 Read 方式就可以了。

- // 列出压缩压缩文件
- using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
- using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
- {
- foreach (var zipArchiveEntry in archive.Entries)
- Console.WriteLine(
- "FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName
- );
- }

2.4 提取压缩文件
当然可以从压缩文件中提取被压缩的内容了。

- // 读取其中一个文件的内容
- using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
- using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
- {
- // 解压某个文件
- ZipArchiveEntry entry = archive.GetEntry("ZipArchiveSample.exe");
- Console.WriteLine(entry.Name);
- using (System.IO.Stream stream = entry.Open())
- {
- System.IO.Stream output = new FileStream("http://www.cnblogs.com/ZipArchiveSample.exe", FileMode.Create);
- int b = -1;
- while ((b = stream.ReadByte()) != -1)
- {
- output.WriteByte((byte) b);
- }
- output.Close();
- }
- }

2.5 更新压缩文件
在压缩文件已经创建之后,还可以打开它,继续添加文件,这就称为更新了,使用 Update 模式。

- // 向现有的压缩文件中添加文件
- using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
- using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
- {
- // 这里添加当前正在执行的程序文件本身
- System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
- string path = assemble.Location;
- string filename = System.IO.Path.GetFileName( path);
- ZipArchiveEntry readMeEntry = archive.CreateEntry( filename );
- using (System.IO.Stream stream = readMeEntry.Open() )
- {
- byte[] bytes = System.IO.File.ReadAllBytes(path);
- stream.Write(bytes, 0, bytes.Length);
- }
- foreach (var zipArchiveEntry in archive.Entries)
- Console.WriteLine(
- "FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName
- );
- }

现在压缩文件中又增加了一个,这可以一个怪异的文件,同一个文件被在压缩文件中添加了两次!
3. 使用 ZipFile
除了上边的基本方法之外,还有一些简单的使用方法。这涉及到另外一个类:ZipFile。
3.1 创建空压缩文件

- // 删除压缩文件
- System.IO.File.Delete(zipFilePath);
- // 使用 ZipFile 的静态方法创建压缩文件,要保证文件没有存在
- using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
- {
- }

3.2 创建并添加文件
直接添加一个文件的方法。直接使用 CreateEntryFromFile 就可以了。

- System.IO.File.Delete(zipFilePath);
- // 使用 CreateEntryFromFile 方法添加文件
- // 使用 ZipFile 的静态方法创建压缩文件
- using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
- {
- System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
- string path = assemble.Location;
- string filename = System.IO.Path.GetFileName(path);
- zipArchive.CreateEntryFromFile(path, filename);
- }

3.3 解压文件
将压缩文件解压到指定的目录中。
- // 解压文件
- ZipFile.ExtractToDirectory(zipFilePath, "../..");
3.4 压缩一个目录
还可以直接将一个目录中所有的文件都压缩到一个压缩文件中。
- // 压缩指定目录中所有文件
- System.IO.File.Delete(zipFilePath);
- ZipFile.CreateFromDirectory(".", zipFilePath);
你是不是最喜欢这个方法?现在压缩文件中的文件更多了。
附录:
SharpZipLib 的下载地址: http://www.icsharpcode.net/OpenSource/SharpZipLib/
.NET 4.5 中新提供的压缩类的更多相关文章
- .NET 4.5 中新提供的压缩类(转载)
Windows8 的开发已经如火如荼开始了,在 Windows8 中提供的 .NET Framework 已经更新到了 4.5 版,其中又增加了一些新的特性,对压缩文件的支持就是其中之一. 在 4.5 ...
- 夯实Java基础(十四)——Java8新的日期处理类
1.前言 Java8之前处理日期一直是Java程序员比较头疼的问题,从Java 8之后,Java里面添加了许多的新特性,其中一个最常见也是最实用的便是日期处理的类——LocalDate.LocalDa ...
- UWP中新加的数据绑定方式x:Bind分析总结
UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...
- Linux 2.6内核中新的锁机制--RCU
转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁 ...
- HTML5中新添加事件
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
- 关于新中新二代身份证读卡器DKQ-A16D的一些问题
今天拿到了新中新DKQ-A16D,随机光盘里有以下文件: 我遇到的问题是,如果直接打开\二代征SDK开发包\DLL\测试程序\C#_2008\WindowsFormsApplication1\目录下的 ...
- Java 8 中新的 Date 和 Time 类入门详解
这篇文章主要是java8中新的Date和Time API的实战.新的Date和Time类是java开发者社区千呼万唤始出来的.Java8 之前存在的Date类一直都受人诟病,很多人都会选择使用第三方的 ...
- pivot 与 unpivot 函数是SQL05新提供的2个函数
pivot 与 unpivot 函数是SQL05新提供的2个函数 ----------------------------------------------------------------- ...
- MySQL 8 中新的复制功能
MySQL 8 中新的复制功能使得操作更加方便,并帮助用户更好地观察复制过程中内部发生的情况. 使用 MySQL 5.7.17 获取 MySQL 组复制插件是一项巨大的工作.组复制是一个新的插件,通过 ...
随机推荐
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...
- iOS开发之多图片无缝滚动组件封装与使用
经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...
- Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布
来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...
- C语言 第四章 分支结构练习
一.输入语文,数学成绩,根据平均分分3档 #include "stdio.h" void main() { //接受用户输入 float chinese,math,avg; pri ...
- JS实现输入框只能输入数字
键盘下落事件实现输入框只能输入数字: <script type="text/javascript"> // 实现输入框只能输入数字 function ValidateN ...
- [AngularJS] AngularJS系列(5) 中级篇之动画
目录 CSS定义 JS定义 ng动画实际帮我们在状态切换的时候 添加特定的样式 从而实现动画效果. 一般我们会通过C3来实现具体的动画. CSS定义 ng-if 图(实际上,图并不能展现出什么): H ...
- 模拟实现SQL Server中的datepart(week,date)的功能
本文目录列表: 1.为什么要模拟实现datepart(week,date)的功能 2.具体实现思路 3.T-SQL代码实现逻辑 4.总结语 5.参考清单列表 1.为什么要模拟实现datepart( ...
- compilation与编译
关于本配置节的内容不算多,但关于ASP.NET编译的内容还是有一点的,鄙人认为只是了解一下即可,主要影响到部署. 在 App_Code 文件夹中使用多种编程语言 因为 App_Code 文件夹中的源代 ...
- jQuery鼠标滚动垂直全屏切换代码
体验效果:http://hovertree.com/texiao/jquery/68/ 源码下载:http://hovertree.com/h/bjaf/f643upc4.htm 代码如下: < ...
- [WCF编程]10.操作:请求/应答操作
一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...