【.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扩展方法,使用该扩展方法,可以把压缩包中的某个文件解压出来。
好了,今天就吹到这里吧。