动态生成Zip文档

 

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

文件流操作相信.net dev们不会陌生,ZipArchive既可以在内存中创建zip文档,也可以创建到新的zip文件中。因为ZipArchive类的构造函数需要传入一个Stream对象来读写,这个Stream可以是内存的流,当然也可以是文件流。

创建ZipArchive实例后,直接调用CreateEntry方法就可以创建压缩文档中的压缩项,创建后会返回一个ZipArchiveEntry实例。

CreateEntry方法需要指定创建的压缩项实体的名字,即zip文档中文件的名字。

如果名字为abc.jpg,那么文件abc.jpg就存储到zip的根目录下。如果想让压缩项有层次性,可以指定相对路径。

比如,指定为one\\abc.txt,那么,就会在zip文档根目录下创建一个名为one的目录,再在one目录下创建文件abc.txt。“\\”可以写成“/”,即one/abc.txt。

再如,输入名称a/b/d.doc,就会在zip文档中创建a目录,再在a目录下创建b目录,最后在b目录下创建文件d.doc。

ZipArchiveEntry实例创建后,可以调用Open方法,方法会返回一个流对象,通过这个流对象,就可以往压缩文件中写入数据了。

当zip文档完成后,调用ZipArchive实例的Dispose方法来释放资源。

接下来看一个例子:

            using (FileStream fsout = new FileStream("test.zip", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
// 创建zip文档实例
ZipArchive archive = new ZipArchive(fsout, ZipArchiveMode.Create);
// 创建根目录下的文件
ZipArchiveEntry entry1 = archive.CreateEntry("第一项.txt", CompressionLevel.Optimal);
// 向文件写入内容
using (StreamWriter wt = new StreamWriter(entry1.Open()))
{
wt.WriteLine("这是压缩的第一个文件。");
}
// 创建位于相对目录的文件
ZipArchiveEntry entry2 = archive.CreateEntry("第二项\\data.txt", CompressionLevel.Optimal);
// 向文件写入内容
using (StreamWriter wt =new StreamWriter(entry2.Open()))
{
wt.WriteLine("这是压缩的第二个文件。");
}
// 创建第三个文件
ZipArchiveEntry entry3 = archive.CreateEntry("第三项/document.txt", CompressionLevel.Optimal);
// 向文件中写入内容
using (StreamWriter wt = new StreamWriter(entry3.Open()))
{
wt.WriteLine("这是压缩的第三个文件。");
} // 操作完成后,要释放zip文档对象
archive.Dispose();
}

上面代码创建的zip文档,结构如下:

是不是很简单呢。好了,由于剧组资金严重不足,本期节目就到此结束了。

示例源代码下载

动态生成Zip的更多相关文章

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

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

  2. Visual Studio动态生成版权信息

    Visual Studio动态生成版权信息 VS2008 1.1,类文件模板:在安装目录打开CS模板文件夹(D:\Program Files (x86)\Microsoft Visual Studio ...

  3. freemarker动态生成word并将生成的word转为PDF,openoffice转换word乱码

    之前项目有个需求,需要先动态生成word内容,然后再预览生成word的内容(不能修改).整理一下,方便以后使用. 网上参考了好多大神的博客.具体也忘了参考谁的了,如有侵权,请告知修改. 思路一: 将目 ...

  4. iTextSharp动态生成多页pdf及追加内容等记录

    1.要动态生成pdf,无非是用第三方或直接代码生成. 2.iTextSharp生成pdf问题点记录 dll相关下载 https://files.cnblogs.com/files/xlgwr/iTex ...

  5. Delphi 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

  6. 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

  7. Aop动态生成代理类时支持带参数构造函数

    一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...

  8. dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来

    dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...

  9. ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi

    点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...

随机推荐

  1. Hot Days Codeforces Round #132 (Div. 2) D(贪婪)

    Description The official capital and the cultural capital of Berland are connected by a single road ...

  2. 大话设计模式C++达到-文章12章-外观模式

    一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...

  3. OpenCV中的SVM參数优化

    SVM(支持向量机)是机器学习算法里用得最多的一种算法.SVM最经常使用的是用于分类,只是SVM也能够用于回归,我的实验中就是用SVM来实现SVR(支持向量回归). 对于功能这么强的算法,opencv ...

  4. 初识google多语言通信框架gRPC系列(二)编译gRPC

    目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要 ...

  5. Spring系列

    Spring系列之访问数据库   阅读目录 一.概述 二.JDBC API的最佳实践 三.Spring对ORM的集成 回到顶部 一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结 ...

  6. 轻松管理您的网络password

    在互联网在现在这个时代,,我们注册了很多帐户.支付宝账号password,各种宝账户password.微信,QQ,电话password,购买各种网站,金融password,它是不是让孩子们的鞋子瞬间淡 ...

  7. 为Linux用ISO制作U盘启动及基本原理

    制作成功后的基本最简文件夹文件图 一.系统的基本引导流程: 首先系统要引导isolinux.bin可执行程序,此程序是移动介质上引导用的,isolinux.bin执行成功后会载入其配置文件syslin ...

  8. Django操作model时刻,一个错误:AttributeError:’ProgrammingError’ object has no attribute ‘__traceback__’

    原因:在Django项目下对应的应用以下的models.py配置的model(也就是class)没有创建成对应的表. 这是怎么回事呢? 首先,将models.py里面的model创建成相应的数据库表的 ...

  9. Springmvc +JNDI 在Tomcat下 配置数据源(转)

    一.             简介 jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务 ...

  10. Android 4.0新组件:GridLayout详细说明

    于Android 4.0(API 14)它提供了一个新的组件GridLayout,它继承自Linearlayout,用于执行网络格样式布局. 在某些方面,GridLayout与TableLayout和 ...