【.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扩展方法,使用该扩展方法,可以把压缩包中的某个文件解压出来。

 

好了,今天就吹到这里吧。

 

本文示例源码下载

 

posted @ 2015-10-14 19:38  东邪独孤  阅读(3750)  评论(0编辑  收藏  举报