浅谈 ZipArchive 类
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 类的更多相关文章
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈java类集框架和数据结构(1)
在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...
- 继承虚函数浅谈 c++ 类,继承类,有虚函数的类,虚拟继承的类的内存布局,使用vs2010打印布局结果。
本文笔者在青岛逛街的时候突然想到的...最近就有想写几篇关于继承虚函数的笔记,所以回家到之后就奋笔疾书的写出来发布了 应用sizeof函数求类巨细这个问题在很多面试,口试题中很轻易考,而涉及到类的时候 ...
- 浅谈 Integer 类
在讲解 Integer 之前,我们先看下面这段代码: public static void main(String[] args) { Integer i = 10; Integer j = 10; ...
- 浅谈Semaphore类
Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...
- 在java中浅谈Math类中的常用方法
通过最近的学习,学到了一些的Math类中的常见方法 package org.stm.demo; public class Test { public static void main(String[] ...
- 浅谈MFC类CrackMe中消息处理函数查找方法
最近一个学姐发给我了一份CrackMe希望我解一下,其中涉及到了MFC的消息函数查找的问题,就顺便以此为例谈一下自己使用的消息函数查找的方法.本人萌新,如果有任何错漏与解释不清的地方,欢迎各路大佬指正 ...
- 浅谈实体类为什么要实现Serializable接口?
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创 ...
- 浅谈Semaphore类-示例
Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...
随机推荐
- 微信小程序入口场景的问题整理与相关解决方案
前言 最近一段时间都在做小程序. 虽然是第二次开发小程序,但是上次做小程序已经是一年前的事了,所以最终还是被坑得死去活来. 这次是从零开始开发一个小程序,其实除了一些莫名其妙的兼容性问题,大多数坑点都 ...
- springmvc下载那些事
文件的上传下载一般在项目中还是非常实用的,此处专门整理一下文件的下载,至于文件的上传实现将在后续中补上.文件的下载多用于模板文件的下载,这在项目中用的还是挺多的.今天用到了就整理出来了,以供搬运工们借 ...
- Spring框架针对dao层的jdbcTemplate操作crud之update修改数据库操作
使用jdbcTemplate 原理是把加载驱动Class.forName("com.mysql.jdbc.Driver"); 和连接数据库Connection conn=Drive ...
- 牛客OI赛制测试赛2 A 无序组数
链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序 ...
- luogu P3393 逃离僵尸岛-搜索剪枝+spfa
P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...
- HTML5新增的主体元素article、section、nav、aside、time元素和pubdate属性
article artticle元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容.它可以是一篇博客或者报刊中的文章,一篇论坛帖子,一段用户评论或者独立的插件或其他任何独立的内容. ...
- 【51nod 1791】 合法括号子段
有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列. 合法括号序列的定义是: 1.空序列是合法括号序列. 2.如果S是合法括号序列,那么(S)是合法括号序列. 3.如果A和B都是合法括号序列 ...
- Codeforces Round #388 (Div. 2) A+B+C!
A. Bachgold Problem 任何一个数都可以由1和2组成,由于n是大于等于2的,也就是可以由2和3组成.要求最多的素数即素数越小越好,很明显2越多越好,如果n为奇数则再输出一个3即可. i ...
- BZOJ1704: [Usaco2007 Mar]Face The Right Way 自动转身机
n<=5000个数0或1,每次可以连续对固定长度区间取反,目标把所有1变0,求一个取反区间的固定长度K使取反次数最少. 答案关于K不单调,因此枚举K,对每个K扫一遍区间,遇到1就把连续K个数反转 ...
- Django学习之 - 基础路由系统
路由系统:URL 1:一个URL对应一个类或函数: url(r'^register',reg.register) 函数写法 url(r'^cbv',reg.cbv.as_view()) 类写法 2:通 ...