【.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 ...
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- 前端学HTTP之web攻击技术
前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...
- [C#] 简单的 Helper 封装 -- RandomHelper
using System; namespace Wen.Helpers { /// <summary> /// 随机数助手 /// </summary> public seal ...
- UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...
- Unity3D框架插件uFrame实践记录(二)
5.创建属性和命令 本小节主要内容包括: 在Element节点上创建属性数据 在Element节点上创建命令数据 5.1.在Element节点上创建属性数据 在这里,我们首先为Login节点中的属性( ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- WebStorm 2016 最新版激活(activation code方式)
WebStorm 2016 最新版激活(activation code方式) WebStorm activation code WebStorm 最新版本激活方式: 今天下载最新版本的WebStorm ...
- ubuntu14.04redis安装以及扩展
redis 安装http://my.oschina.net/quanpower/blog/282546#OSC_h2_2redis扩展安装wget https://github.com/nicolas ...
- 腾讯云下安装 nodejs + 实现 Nginx 反向代理
本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑 ...