【.NET深呼吸】Zip文件操作(1):创建和读取zip文档
.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文档的更多相关文章
- C#操作Excel(2)-- 打开-读取Excel文档
由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...
- XML文件操作类--创建XML文件
这个类是在微软XML操作类库上进行的封装,只是为了更加简单使用,包括XML类创建节点的示例. using System; using System.Collections; using System. ...
- iOS——文件操作NSFileManager (创建、删除,复制,粘贴)
iOS——文件操作NSFileManager (创建.删除,复制,粘贴) iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视 ...
- java中XML操作:xml与string互转、读取XML文档节点及对XML节点增删改查
一.XML和String互转: 使用dom4j程式变得很简单 //字符串转XML String xmlStr = \"......\"; Document document = D ...
- (转)创建和查看Javadoc文档
原地址:http://jinnaxu-tju-edu-cn.iteye.com/blog/667177 Javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代 ...
- 编写Java程序,在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字“[ 来自新华社 ]”,保存到一个新的 txt 文件内
查看本章节 查看作业目录 需求说明: 在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字"[ 来自新华社 ]",保存到一个新的 txt 文件内 实现思路: 创建 Sa ...
- 1.2.3 创建Cocos2D-iPhone的帮助文档
http://book.51cto.com/art/201303/383957.htm <Cocos2D权威指南>第1章开始前的准备工作,本章我们将介绍什么是Cocos2D以及有关Coco ...
- 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档
通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...
- PHP 文件操作类(创建文件并写入) 生成日志
<?php /** * 文件操作(生成日志)支持多条插入 * (假设插入多条语句并换行 用','逗号分开) * */ class log { public $path = './info.txt ...
随机推荐
- Asp.net Boilerplate之AbpSession扩展
当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- redux学习
redux学习: 1.应用只有一个store,用于保存整个应用的所有的状态数据信息,即state,一个state对应一个页面的所需信息 注意:他只负责保存state,接收action, 从store. ...
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- 在 C# 里使用 F# 的 option 变量
在使用 C# 与 F# 混合编程的时候(通常是使用 C# 实现 GUI,F#负责数据处理),经常会遇到要判断一个 option 是 None 还是 Some.虽然 Option module 里有 i ...
- 6. ModelDriven拦截器、Preparable 拦截器
1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...
- android 两种实现计时器时分秒的实现,把时间放在你的手中~
可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲 ...
- HTML5实现文件断点续传
HTML5的FILE api,有一个slice方法,可以将BLOB对象进行分割.前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段 ...
- javascript arguments(转)
什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agru ...
- AndroidStudio — Error:Failed to resolve: junit:junit:4.12错误解决
原博客:http://blog.csdn.net/u013443865/article/details/50243193 最近使用AndroidStudio出现以下问题: 解决:打开app下的buil ...