.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 组复制插件是一项巨大的工作.组复制是一个新的插件,通过 ...
随机推荐
- Protocol Buffers学习教程
最近看公司代码的过程中,看到了很多proto后缀的文件,这是个啥玩意?问了大佬,原来这是Protocol Buffers! 这玩意是干啥的?查完资料才知道,又是谷歌大佬推的开源组件,这玩意完全可以取代 ...
- win8.1系统出现C0000034正在应用更新操作怎么办
说来也奇怪,笔者Dell台式机前几天系统提示有更新,笔者对系统进行了更新,可昨天开机后,就出现了C0000034正在应用更新操作的情况,且电脑一直没反应,上网搜了一下帖子,发现复制粘贴的帖子好多,基本 ...
- MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report e
早上来到公司,线上的项目报错: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionExcepti ...
- 盘点 React 16.0 ~ 16.5 主要更新及其应用
目录 0. 生命周期函数的更新 1. 全新的 Content API 2. React Strict Mode 3. Portal 4. Refs 5. Fragment 6. 其他 7. 总结 生命 ...
- js中 变量的解构赋值
es6新特性, 提取数组或对象中的值,按照对应位置, 为变量赋值. let [a, b, c] = [1, 2, 3]; 交换变量的值变得容易 let x = 1; let y = 2; [x, y] ...
- postgresql数据库安装及简单操作
自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手.以下内容基于Debian操作系统,其他操作系 ...
- Web前端攻击方式及防御措施
一.XSS [Cross Site Script]跨站脚本攻击 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户 ...
- ruby离线安装整理
参考官方文档: https://rvm.io/rvm/offline 参考博客:https://blog.csdn.net/topswim/article/details/79260369 一.前提 ...
- 查看linux系统的运行级别
查看当前系统的运行级别[root@apenglinux ~]# runlevel3 5查看系统的默认级别[root@apenglinux ~]# systemctl get-defaultgraphi ...
- ubuntu安装notepad++
sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update sudo apt-get install notepa ...