通过前面一篇烂文的介绍,大伙儿知道,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文档,结构如下:
是不是很简单呢。好了,由于剧组资金严重不足,本期节目就到此结束了。