基于.NET平台实现ZIP文件操作

时间:2022-10-20 08:48:54

基于.NET平台实现ZIP文件操作

摘要:伴随着信息技术的发展,文件的容量也越来越大,在网络质量没有得到很大改观的情况下。为了更好的传送大容量文件,压缩技术被广泛的使用到各种大容量信息处理的场合。该文将使用基于.NET的pression命名空间中的相关类来解决ZIP文件的压缩和解压缩等相关问题,并对其中存在一些缺陷进行改进,提高操作效率。

关键词: .NET;压缩; ZIP文件操作

中图分类号:TP312文献标识码:A文章编号:1009-3044(2012)15-3574-03

.NET平台下进行压缩和解压缩首先会想到的是GZipStream类,它能够较为简单的实现对文件的压缩和解压缩。但其仅仅限于GZIP格式的文件,对于其他文件格式的压缩和解压缩则需要类似于SharpZipLib的开源类库来完成。

.NET 4.5平台是微软的最新.NET平台,是在.NET4.0基础上进行一次改进。其中一个变化就是丰富了pression命名空间。通过它可以非常方便的实现对文件的压缩和解压缩。

1实现压缩包操作的功能

1.1实现文件夹的压缩功能

为了使用pressio命名空间的压缩功能,你需要安装NET4.5,并在项目中添加引用pression和Sys pression.ZipArchive两个命名空间。请注意必须要添加pression.ZipArchive命名空间。

如果希望能够压缩一个文件夹到指定的目录,只需要调用ZipFile类的CreateFromDirectory方法,即可实现将D:\ZipDemo\Logs文件夹压缩为Logs.zip文件:

ZipFile.CreateFromDirectory(@“D:\ZipDemo\Logs”, @“D:\ZipTemp\Logs.zip”);

上面方法中的路径可以使用绝对路径也可以使用相对路径,@符号的作用是指明后面是一个字符串常量。CreateFromDirectory默认此采用的最优化压缩,也可以根据需要修改压缩的情况。

1.2实现文件的解压缩功能

如果希望能够解压缩一个文件到指定的目录,只需要调用ZipFile类的ExractToDirectory方法,即可实现将Logs.zip文件解压到Temp文件夹中:

ZipFile.ExractToDirectory(@“D:\ZipTemp\Logs.zip”, @“D:\Temp”);

使用上面的代码就可以将压缩文件解压缩了,但同时又会出现一个问题。即该解压目录下已经包含解压包中的某个文件时,解压操作会抛出错误。那么仅仅使用这个方法是不能解决所有的解压情况的。如何才能解决以上的问题哪?我们可以通过打开压缩包,根据具体的情况对压缩包中的每个文件进行处理。

1.3实现压缩包打开功能

有时需要打开压缩包,并对压缩包中的文件进行处理。如要实现这一功能,需要遍历整个压缩包中所有文件。//打开压缩包

using (ZipArchive archive = ZipFile.OpenRead(zipName))

{foreach (ZipArchiveEntry file in archive.Entries) //循环读取压缩包中的文件

{ fileUnzipFullName = bine(dirToUnzipTo, file.FullName); //读取文件路径信息

if (!System.IO.File.Exists(fileUnzipFullName)) //判断文件是否存在

{file.ExtractToFile(fileUnzipFullName); //解压文件

}

}

}

非常庆幸的是ZipArchive实现了Idisposable接口,通过代码可以非常方便的遍历所有的文件,并根据文件的具体情况判断是否解压。OpenRead方法是一个只读的方法,也就意味着对压缩包只能读取不能修改,但很多情况下,需要对已有的压缩包进行修改。那么又该如何去修改压缩包中的文件哪?我们可以通过修改模式打开压缩包,根据具体的情况向压缩包中添加或修改文件。

1.4实现创建和修改压缩包功能

在前面的介绍中,我们了解了如果压缩一个文件夹,但在平时的使用中,可能更多的是压缩某个文件夹下的某几个文件。下面的代码将完成新建一个压缩包,并添加若干文件到该压缩包中。using (ZipArchive newFile = ZipFile.Open(zipName, ZipArchiveMode.Create)) //创建一个压缩包{ newFile.CreateEntryFromFile(@”D:\Temp\File1.txt”,“File1.txt”); //添加一个文件到该压缩包

…}

注意在这里我们使用Open,可以实现对压缩包的创建和修改。ZipArchiveMode.Create参数指明了Open方法的模式是创建模式,当然Open方法也可以实现打开压缩包的功能,使用的方法基本上是一样的。如果希望对压缩包的文件的修改,只需要把ZipAr chiveMode.Create参数替换成ZipArchiveMode.Update就可以了。

2拓展基本功能

现在,我们了解了pression命名空间的基本功能。同时我们也发现该命名空间的功能也存在一些缺陷,比如文件已经存在,文件夹不存在等。接着我们通过增加了一个辅助的命名空间来丰富pression命名空间。

在pression命名空间增加一个ExtractToDirectory方法,该方法不是盲目地解压缩文件,而是遍历压缩包中每个文件,并与目标目录中的文件进行比较。如果目标目录中存在该文件,则根据不同情况处理压缩包中的文件,比如覆盖,忽略等。同时对目标目录进行检查,如果该目录不存在,则新建解压目录,保证文件解压正常。通过ExtractToDirectory方法可以更好的完成解压功能。

// sourceArchiveFileName代表压缩包路径

// destinationDirectoryName代表解压目录

// overwriteMethod代表覆盖方式

public static void ImprovedExtractToDirectory(string sourceArchiveFileName,

string destinationDirectoryName,

Overwrite overwriteMethod)

{ using (ZipArchive archive = ZipFile.OpenRead(sourceArchiveFileName))

{ foreach (ZipArchiveEntry file in archive.Entries)

{ ImprovedExtractToFile(file, destinationDirectoryName, overwriteMethod);

}}}

其中ImprovedExtractToFile是我们新增的用来解决解压到文件的功能。

// ZipArchiveEntry代表压缩包

// destinationPath代表解压目录

// overwriteMethod代表覆盖方式

public static void ImprovedExtractToFile(ZipArchiveEntry file,

string destinationPath,

Overwrite overwriteMethod)

{ string destinationFileName = bine(destinationPath, file.FullName);

string destinationFilePath = Path.GetDirectoryName(destinationFileName);

Directory.CreateDirectory(destinationFilePath);

switch (overwriteMethod)

{ case Overwrite.Always: file.ExtractToFile(destinationFileName, true);

break;

case Overwrite.IfNewer:

if (!File.Exists(destinationFileName)

|| File.GetLastWriteTime(destinationFileName) < file.LastWriteTime)

file.ExtractToFile(destinationFileName, true);

break;

case Overwrite.Never:

if (!File.Exists(destinationFileName))

file.ExtractToFile(destinationFileName);

break;}}

3测试

创建一个测试数据池,笔者创建了10,000个文本文件,每个有10000行文本。很容易地创建,也容易压缩的文本文件。然后测试代码对WinRAR和7ZIP。测试结果如表1所示。

通过表1的数据我们可以看出不同压缩软件在不同压缩级别下时间和容量都略有不同,也可以看出通过pression命名空间来进行压缩,其效果并不如专业的压缩软件。所以在实际使用中我们需要根据具体的情况来判断使用哪种技术,当然开源的第三发类库也是一个不错的选择。

4结束语

在NET4.5的pression命名空间中提供了一个简单的方法来处理zip文件。我们可以建立压缩文档,更新压缩文档,并提取其中的文件。通过它已经可以实现基本功能,虽然其中还有一些缺点,我们也可以通过一些方法来提高和改进它。

参考文献:

[1] Nagel C.C#高级编程[M].7版.北京:清华大学出版社,2010.

[2] Richter J. CLR via C#[M].3版.北京:清华大学出版社,2010.

[3] Troelsen A.C#与.NET 4高级程序设计[M].5版.北京:人民邮电出版社,2011.

上一篇:高校学生干部信息管理系统的开发 下一篇:基于监控工具与入侵检测的实时通讯以防治蠕虫...