Microsoft .NET Framework 4.5 新增了 ZipArchive 类

Microsoft Windows 8 Consumer Preview 操作系统已经内置了 Microsoft .NET Framework 4.5,它新增了对 Zip 文件的支持。这是通过 System.IO.Compression 命名空间中新增的 ZipArchive、ZipFile 等类实现的。注意,Microsoft .NET Framework 2.0 中已经有的 GZipStream、DeflateStream 类仅仅能处理单一的 Zip 流。不支持包括多个文件的 Zip 压缩包。

创建 Zip 压缩包

创建 Zip 压缩包很easy。例如以下 ZipCreater.cs 所看到的:

 1 using System;
2 using System.IO.Compression;
3
4 namespace Skyiv.Tester
5 {
6 sealed class ZipCreater
7 {
8 static void Main()
9 {
10 using (var zip = ZipFile.Open("ZipCreater.zip", ZipArchiveMode.Create))
11 {
12 zip.CreateEntryFromFile(@"C:\work\ZipCreater.cs", "ZipCreater.cs");
13 zip.CreateEntryFromFile("ZipCreater.exe", "ZipCreater.exe");
14 }
15 }
16 }
17 }

上述程序中。ZipFile 类的 Open 方法返回 类型为 ZipArchive 的变量 zip,然后调用 ZipArchvie 类的扩展方法 CreateEntryFromFile 来把文件增加到 Zip 压缩包中,该扩展方法在 ZipFileExtensions 类中定义。

在 Microsoft Windows 8 Consumer Preview 操作系统中编译和执行:

C:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc ZipCreater.cs -r:System.IO.Compression.dll -r:System.IO.Compression.FileSystem.dll
Microsoft (R) Visual C# Compiler version 4.0.30319.17379
for Microsoft (R) .NET Framework 4.5
版权全部 (C) Microsoft Corporation。 保留全部权利。 C:\work> ZipCreater

该程序的执行结果是生成一个例如以下所看到的的 Zip 压缩包 ZipCreater.zip:

将压缩包解压到指定文件夹

我们来看看 Unzip.cs:

 1 using System;
2 using System.IO.Compression;
3
4 namespace Skyiv.Utils
5 {
6 sealed class Unzip
7 {
8 static void Main(string[] args)
9 {
10 if (args.Length != 2)
11 {
12 Console.WriteLine("Usage: Unzip zip-file-name directory-name");
13 return;
14 }
15 try { ZipFile.ExtractToDirectory(args[0], args[1]); }
16 catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
17 }
18 }
19 }

上述程序的核心内容是第 15 行使用 ZipFile 类的静态方法 ExtractToDirectory 把压缩包中的全部文件解压到指定文件夹。编译和执行的结果例如以下所看到的:

C:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc Unzip.cs -r:System.IO.Compression.FileSystem.dll
Microsoft (R) Visual C# Compiler version 4.0.30319.17379
for Microsoft (R) .NET Framework 4.5
版权全部 (C) Microsoft Corporation。保留全部权利。 C:\work> Unzip ZipCreater.zip ZipCreater

将指定文件夹中的全部文件打包到压缩包中

再看看以下的 Zip.cs:

 1 using System;
2 using System.IO.Compression;
3
4 namespace Skyiv.Utils
5 {
6 sealed class Zip
7 {
8 static void Main(string[] args)
9 {
10 if (args.Length != 2)
11 {
12 Console.WriteLine("Usage: Zip zip-file-name directory-name");
13 return;
14 }
15 try { ZipFile.CreateFromDirectory(args[1], args[0]); }
16 catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
17 }
18 }
19 }

上述程序的核内容是第 15 行使用 ZipFile 类的静态方法 CreateFromDirectory 把指定文件夹中的全部文件打包成一个压缩包。编译和执行的结果例如以下所看到的:

C:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc Zip.cs -r:System.IO.Compression.FileSystem.dll
Microsoft (R) Visual C# Compiler version 4.0.30319.17379
for Microsoft (R) .NET Framework 4.5
版权全部 (C) Microsoft Corporation。 保留全部权利。 C:\work> Zip ZipCreater.2.zip ZipCreater

直接读取网络上的压缩包的内容

我把前面生成的 ZipCreater.zip 文件上传到博客园,然后写一个程序直接从博客园的server上读取该压缩包中的 ZipCreater.cs 文件的内容显示在屏幕上:

 1 using System;
2 using System.IO;
3 using System.IO.Compression;
4 using System.Net;
5
6 namespace Skyiv.Test
7 {
8 static class ZipTester
9 {
10 static void Main()
11 {
12 using (var zip = new ZipArchive(new Uri(
13 "http://files.cnblogs.com/skyivben/ZipCreater.zip").GetHttpStream()))
14 zip.GetEntry("ZipCreater.cs").Open().CopyTo(Console.OpenStandardOutput());
15 }
16
17 static Stream GetHttpStream(this Uri uri)
18 {
19 return ((HttpWebResponse)((HttpWebRequest)WebRequest.Create(uri)).GetResponse()).GetResponseStream();
20 }
21 }
22 }

上述程序中:

  • 第 13 行通过调用在第 17 到 20 行定义的 GetHttpStream 扩展方法得到一个网络流,然后使用该网络流来构造一个 ZipArchive 类。
  • 第 14 行调用 ZipArchive 类的 GetEntry 方法得到一个 ZipArchiveEntry 类,然后调用 ZipArchiveEntry 类的 Open 方法就得到所须要的 Stream 类,直接调用Stream 类的 CopyTo 方法写入标准输出。

这个程序的执行结果例如以下所看到的:

浅谈 ZipArchive 类的更多相关文章

  1. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  2. 浅谈java类集框架和数据结构(1)

    在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...

  3. 继承虚函数浅谈 c++ 类,继承类,有虚函数的类,虚拟继承的类的内存布局,使用vs2010打印布局结果。

    本文笔者在青岛逛街的时候突然想到的...最近就有想写几篇关于继承虚函数的笔记,所以回家到之后就奋笔疾书的写出来发布了 应用sizeof函数求类巨细这个问题在很多面试,口试题中很轻易考,而涉及到类的时候 ...

  4. 浅谈 Integer 类

    在讲解 Integer 之前,我们先看下面这段代码: public static void main(String[] args) { Integer i = 10; Integer j = 10; ...

  5. 浅谈Semaphore类

    Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...

  6. 在java中浅谈Math类中的常用方法

    通过最近的学习,学到了一些的Math类中的常见方法 package org.stm.demo; public class Test { public static void main(String[] ...

  7. 浅谈MFC类CrackMe中消息处理函数查找方法

    最近一个学姐发给我了一份CrackMe希望我解一下,其中涉及到了MFC的消息函数查找的问题,就顺便以此为例谈一下自己使用的消息函数查找的方法.本人萌新,如果有任何错漏与解释不清的地方,欢迎各路大佬指正 ...

  8. 浅谈实体类为什么要实现Serializable接口?

    序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创 ...

  9. 浅谈Semaphore类-示例

    Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...

随机推荐

  1. CQOI2018 九连环 打表找规律 fft快速傅里叶变换

    题面: CQOI2018九连环 分析: 个人认为这道题没有什么价值,纯粹是为了考算法而考算法. 对于小数据我们可以直接爆搜打表,打表出来我们可以观察规律. f[1~10]: 1 2 5 10 21 4 ...

  2. bzoj3272 Zgg吃东西

    题目描述: bz 题解: 线段树模拟费用流. 想法和种树有点类似. 每次取区间内权值和最大的一段,然后整体乘$-1$,代表再次选中时会去掉之前的影响. 线段树维护一堆东西…… 小白逛公园双倍快乐.乘$ ...

  3. MySQL redo log 与 binlog 的区别

    MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...

  4. 使用window.open打开新窗口被浏览器拦截的解决方案

    问题描述: 代码中直接使用window.open('//www.baidu.com', '_blank');会被浏览器窗口拦截 原因浏览器为了维护用户安全和体验,在JS中直接使用window.open ...

  5. nginx启动、重启、关闭、升级

    一.启动 cd usr/local/nginx/sbin ./nginx 二.重启 更改配置重启nginx kill -HUP 主进程号或进程号文件路径 或者使用 cd /usr/local/ngin ...

  6. Web前端静态页面示例

    目录结构: Web25\ |—css\ reset.css.common.css.index.css.login.css.reg.css |—js\ jquery-3.3.1.js.index.js. ...

  7. JavaEE JDBC 了解数据库连接池

    了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...

  8. C#中为什么不能再方法里定义静态变量(Static)

    c#的静态变量是在对象生成的时候分配内存空间的,而不是函数执行的时候. 如果在函数里定义,那么这个变量就需要在函数执行的时候分配内存空间,这是C#不允许的,至于为什么不允许,个是因为垃圾回收机制的问题 ...

  9. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  10. 博弈 Nim问题 POJ2234

    定义: 通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是 “选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了, 则判负(因为他此刻 ...