浅谈 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( ...
随机推荐
- mysql踩坑
com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value '****** ...
- Java:获取文件内容
文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...
- php 快速导出大量CSV文件
原文链接 https://segmentfault.com/a/1190000005366832 /** * 导出excel(csv) * @data 导出数据 * @headlist 第一行,列名 ...
- 基于flask的网页聊天室(四)
基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...
- 剑指Offer(书):旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 【C#】【数据结构】005-栈:顺序栈
C#数据结构:顺序栈 1.自定义顺序栈结构: /// <summary> /// 顺序栈 /// </summary> /// <typeparam name=" ...
- [第一波模拟\day1\T2]{分班}(divide.cpp)
[题目描述] 小N,小A,小T又大了一岁了. 现在,他们已经是高二年级的学生了.众所周知,高二的小朋友是要进行文理科分班考试的,这样子的话,三个好朋友说不定就会不分在一个班. 于是三个人决定,都考平均 ...
- 洛谷 P3387 【模板】缩点 DAGdp学习记
我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...
- zoj 2736 Daffodil number
Daffodil number Time Limit: 2 Seconds Memory Limit: 65536 KB The daffodil number is one of the ...
- FZU-2148-Moon Game,,几何计算~~
Problem 2148 Moon Game Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Fat brothe ...