.net的IO操作支持对zip文件的创建、读写和更新。使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办。

要对zip文件进行操作,主要用到以下三个类:

1、ZipFile。表示与一个zip文件操作相关的类。可以使用该类创建zip文件,或者打开zip文件。

2、ZipArchive。表示一个zip文档实例,可以通过它直接从流对象创建zip文档。ZipFile类主要是针对磁盘文件来进行操作,而ZipArchive表示的是zip包,不一定是存放在硬盘上的.zip文件,因为它可以基于流来创建,所以可以是存在于内存中,或者用于网络传输的数据。

3、ZipArchiveEntry。文档项实体。表示zip压缩包中的一个文件实体。zip文档中以文件为项实体,如果存在目录结构,就以当前文档为根,用相对路径来描述文件实体。比如:\目录1\目录2\文件1。

首先看一下如何从现有目录(包含该目录下的所有内容)来创建新的.zip文件。ZipFile类公开了CreateFromDirectory方法,这个方法有几个重载,如果不考虑其他因素,只是简单创建.zip文件,可以使用以下重载:

static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)

方法不返回内容,sourceDirectoryName参数指定要用来创建压缩文档的源目录,destinationArchiveFileName就是新创建的压缩文件的完整路径,如c:\abc.zip。

如果想控制压缩级别,可以使用以下重载:

void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, System.IO.Compression.CompressionLevel compressionLevel, bool includeBaseDirectory)

compressionLevel参数表示压缩的层次,includeBaseDirectory参数表示是否把sourceDirectoryName中的目录名也放到.zip文件的根中,如果是就为true,否则为false。

看看例子:

            try
{
ZipFile.CreateFromDirectory(textBox1.Text, textBox2.Text);
msg = "操作成功。";
}
catch (Exception ex)
{
msg = ex.Message;
}
MessageBox.Show(msg, "提示", MessageBoxButtons.OK);

是不是很简单。

========================================================

下面再看看如何解压。与创建压缩文件相对,ZipFile类也公开了ExtractToDirectory方法,该方法的作用就是把指定.zip文件中的内容解压到指定的目录下。其中较简单的一个重载如下:

static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName)

sourceArchiveFileName参数指定要解压的zip文件的完整路径或相对路径;destinationDirectoryName参数指定一个目录,被压的内容就放到这个目录下。

请看例子:

            try
{
ZipFile.ExtractToDirectory(txtZipFile.Text, txtDestDir.Text);
msg = "解压成功。";
}
catch (Exception ex)
{
msg = ex.Message;
}
MessageBox.Show(msg, "提示", MessageBoxButtons.OK);

在操作时应当把代码放在try语句块中,毕竟很难保证不发生意外。

======================================================

最后,来看看如何扫描出.zip文件中的文件列表。ZipFile类带了两个方法:要是只考虑对.zip文件进行只读处理,调用OpenRead方法就可以了。如果希望对文件进只读以外的处理,请调用Open方法。

不管你调用的是哪个方法,都会返回一个ZipArchive实例,它表示一个zip文档,我们在代码中可以对该文档进行访问或修改。ZipArchive对象有个Entries属性,表示zip文件中所包含的文件列表,类型只会把压缩包中的文件视为一个实体,目录不被作为实体处理。该属性可以返回一个只读的ZipArchiveEntry实例列表,列表中的每一个ZipArchiveEntry对象表示压缩包中的一个文件。

ZipArchiveEntry类有几个属性可以获取文件信息。

Name:文件名,不包含相对路径。

FullName:包含相对路径和文件名。

Length:压缩前文件大小。

CompressedLength:压缩后文件大小。

请看下面例子:

            try
{
// 打开zip文件
ZipArchive archive = ZipFile.OpenRead(txtInputFile.Text);
// 获取文件列表
var files = archive.Entries;
// 显示列表
lbFiles.ItemsSource = files;
msg = "读取成功。";
}
catch (Exception ex)
{
msg = ex.Message;
}

上面代码读取一个.zip文件,并列表压缩文档中的文件对象。结果如下图所示。

另外,ZipArchiveEntry类还定义了ExtractToFile扩展方法,使用该扩展方法,可以把压缩包中的某个文件解压出来。

好了,今天就吹到这里吧。

本文示例源码下载

【.NET深呼吸】Zip文件操作(1):创建和读取zip文档的更多相关文章

  1. C#操作Excel(2)-- 打开-读取Excel文档

    由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...

  2. XML文件操作类--创建XML文件

    这个类是在微软XML操作类库上进行的封装,只是为了更加简单使用,包括XML类创建节点的示例. using System; using System.Collections; using System. ...

  3. iOS——文件操作NSFileManager (创建、删除,复制,粘贴)

    iOS——文件操作NSFileManager (创建.删除,复制,粘贴)       iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视 ...

  4. java中XML操作:xml与string互转、读取XML文档节点及对XML节点增删改查

    一.XML和String互转: 使用dom4j程式变得很简单 //字符串转XML String xmlStr = \"......\"; Document document = D ...

  5. (转)创建和查看Javadoc文档

    原地址:http://jinnaxu-tju-edu-cn.iteye.com/blog/667177 Javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代 ...

  6. 编写Java程序,在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字“[ 来自新华社 ]”,保存到一个新的 txt 文件内

    查看本章节 查看作业目录 需求说明: 在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字"[ 来自新华社 ]",保存到一个新的 txt 文件内 实现思路: 创建 Sa ...

  7. 1.2.3 创建Cocos2D-iPhone的帮助文档

    http://book.51cto.com/art/201303/383957.htm <Cocos2D权威指南>第1章开始前的准备工作,本章我们将介绍什么是Cocos2D以及有关Coco ...

  8. 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档

    通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...

  9. PHP 文件操作类(创建文件并写入) 生成日志

    <?php /** * 文件操作(生成日志)支持多条插入 * (假设插入多条语句并换行 用','逗号分开) * */ class log { public $path = './info.txt ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  2. 在传统.NET Framework 上运行ASP.NET Core项目

    新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...

  3. .NET Core全新路线图

    .NET Core / ASP.NET Core 1 RTM发布两周后,社区也很积极,收到了非常多的反馈,上周五微软的scott Hunter 在dotnet团队官方博客上发布了.NET Core全新 ...

  4. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  5. 动手做第一个Chrome插件

    Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...

  6. vue.js初探

    前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...

  7. Java 经典入门(一)

    一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...

  8. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  9. css实现文本框和下拉框结合的案例

    html 代码部分 <div id="list-name-input" class="list-name-input"> <select ty ...

  10. TCP的数据传输小结

    TCP的交互数据流 交互式输入 通常每一个交互按键都会产生一个数据分组,也就是说,每次从客户传到服务器的是一个字节的按键(而不是每次一行) 经受时延的确认 通常TCP在接受到数据时并不立即发送ACK: ...