北大青鸟中关村软件园地址:北京市海淀区上地信息路甲28号科实大厦B座3层(B305)浅谈ZipArchive类Microsoft.NETFramework4.5新增了ZipArchive类MicrosoftWindows8ConsumerPreview操作系统已经内置了Microsoft.NETFramework4.5,它新增了对Zip文件的支持,这是通过System.IO.Compression命名空间中新增的ZipArchive、ZipFile等类实现的。注意,Microsoft.NETFramework2.0中已经有的GZipStream、DeflateStream类只能处理单一的Zip流,不支持包含多个文件的Zip压缩包。创建Zip压缩包创建Zip压缩包非常简单,如下ZipCreater.cs所示:1usingSystem;2usingSystem.IO.Compression;34namespaceSkyiv.Tester5{6sealedclassZipCreater7{8staticvoidMain()9{10using(varzip=ZipFile.Open(ZipCreater.zip,ZipArchiveMode.Create))11{12zip.CreateEntryFromFile(@C:\work\ZipCreater.cs,ZipCreater.cs);13zip.CreateEntryFromFile(ZipCreater.exe,ZipCreater.exe);14}15}16}17}上述程序中,ZipFile类的Open方法返回类型为ZipArchive的变量zip,然后调用ZipArchvie类的扩展方法CreateEntryFromFile来把文件加入到Zip压缩包中,该扩展方法在ZipFileExtensions类中定义。在MicrosoftWindows8ConsumerPreview操作系统中编译和运行:C:\workC:\Windows\Microsoft.NET\Framework\v4.0.30319\cscZipCreater.cs-r:System.IO.Compression.dll-r:System.IO.Compression.FileSystem.dllMicrosoft(R)VisualC#Compilerversion4.0.30319.17379forMicrosoft(R).NETFramework4.5版权所有(C)MicrosoftCorporation。保留所有权利。北大青鸟中关村软件园地址:北京市海淀区上地信息路甲28号科实大厦B座3层(B305)C:\workZipCreater该程序的运行结果是生成一个如下所示的Zip压缩包ZipCreater.zip:将压缩包解压到指定目录我们来看看Unzip.cs:1usingSystem;2usingSystem.IO.Compression;34namespaceSkyiv.Utils5{6sealedclassUnzip7{8staticvoidMain(string[]args)9{10if(args.Length!=2)11{12Console.WriteLine(Usage:Unzipzip-file-namedirectory-name);13return;14}15try{ZipFile.ExtractToDirectory(args[0],args[1]);}16catch(Exceptionex){Console.Error.WriteLine(ex.Message);}17}18}19}上述程序的核心内容是第15行使用ZipFile类的静态方法ExtractToDirectory把压缩包中的所有文件解压到指定目录。编译和运行的结果如下所示:北大青鸟中关村软件园地址:北京市海淀区上地信息路甲28号科实大厦B座3层(B305)C:\workC:\Windows\Microsoft.NET\Framework\v4.0.30319\cscUnzip.cs-r:System.IO.Compression.FileSystem.dllMicrosoft(R)VisualC#Compilerversion4.0.30319.17379forMicrosoft(R).NETFramework4.5版权所有(C)MicrosoftCorporation。保留所有权利。C:\workUnzipZipCreater.zipZipCreater将指定目录中的所有文件打包到压缩包中再看看下面的Zip.cs:1usingSystem;2usingSystem.IO.Compression;34namespaceSkyiv.Utils5{6sealedclassZip7{8staticvoidMain(string[]args)9{10if(args.Length!=2)11{12Console.WriteLine(Usage:Zipzip-file-namedirectory-name);13return;14}15try{ZipFile.CreateFromDirectory(args[1],args[0]);}16catch(Exceptionex){Console.Error.WriteLine(ex.Message);}17}18}19}上述程序的核内容是第15行使用ZipFile类的静态方法CreateFromDirectory把指定目录中的所有文件打包成一个压缩包。编译和运行的结果如下所示:C:\workC:\Windows\Microsoft.NET\Framework\v4.0.30319\cscZip.cs-r:System.IO.Compression.FileSystem.dllMicrosoft(R)VisualC#Compilerversion4.0.30319.17379forMicrosoft(R).NETFramework4.5版权所有(C)MicrosoftCorporation。保留所有权利。C:\workZipZipCreater.2.zipZipCreater北大青鸟中关村软件园地址:北京市海淀区上地信息路甲28号科实大厦B座3层(B305)直接读取网络上的压缩包的内容我把前面生成的ZipCreater.zip文件上传到博客园,然后写一个程序直接从博客园的服务器上读取该压缩包中的ZipCreater.cs文件的内容显示在屏幕上:1usingSystem;2usingSystem.IO;3usingSystem.IO.Compression;4usingSystem.Net;56namespaceSkyiv.Test7{8staticclassZipTester9{10staticvoidMain()11{12using(varzip=newZipArchive(newUri(13).GetHttpStream()))14zip.GetEntry(ZipCreater.cs).Open().CopyTo(Console.OpenStandardOutput());15}1617staticStreamGetHttpStream(thisUriuri)18{19return((HttpWebResponse)((HttpWebRequest)WebRequest.Create(uri)).GetResponse()).GetResponseStream();20}21}22}上述程序中:第13行通过调用在第17到20行定义的GetHttpStream扩展方法得到一个网络流,然后使用该网络流来构造一个ZipArchive类。第14行调用ZipArchive类的GetEntry方法得到一个ZipArchiveEntry类,然后调用ZipArchiveEntry类的Open方法就得到所需要的Stream类,直接调用Stream类的CopyTo方法写入标准输出。这个程序的运行结果如下所示:北大青鸟中关村软件园地址:北京市海淀区上地信息路甲28号科实大厦B座3层(B305)注意,上述程序仅仅是从网络上读取所需的内容,并没有下载整个压缩包,更没有在本地硬盘上创建临时文件。以上这些都是Microsoft.NETFramework4.5自身就有的功能,没有使用第三方法的类库,比如SharpZipLib之类的东东。遗憾的是,Microsoft.NETFramework4.5只能在Windows7、Windows8、WindowsServer2008和WindowsServer8等操作系统上安装。更早的Windows操作系统无法安装Microsoft.NETFramework4.5。----资料来源北大青鸟中关村总校官网北大青鸟中关村软件园官网北大青鸟中关村学士后本部官网