Microsoft .NET Framework 4.5 新增了 ZipArchive 类
Microsoft Windows 8 Consumer Preview 操作系统已经内置了 Microsoft .NET Framework 4.5,它新增了对 Zip 文件的支持,这是通过 System.IO.Compression 命名空间中新增的 ZipArchive、ZipFile 等类实现的。注意,Microsoft .NET Framework 2.0 中已经有的 GZipStream、DeflateStream 类只能处理单一的 Zip 流,不支持包含多个文件的 Zip 压缩包。
创建 Zip 压缩包
创建 Zip 压缩包非常简单,如下 ZipCreater.cs 所示:
1 using System;
2 using System.IO.Compression;
3
4 namespace Skyiv.Tester
5 {
6 sealed class ZipCreater
7 {
8 static void Main()
9 {
10 using (var zip = ZipFile.Open("ZipCreater.zip", ZipArchiveMode.Create))
11 {
12 zip.CreateEntryFromFile(@"C:\work\ZipCreater.cs", "ZipCreater.cs");
13 zip.CreateEntryFromFile("ZipCreater.exe", "ZipCreater.exe");
14 }
15 }
16 }
17 }
上述程序中,ZipFile 类的 Open 方法返回 类型为 ZipArchive 的变量 zip,然后调用 ZipArchvie 类的扩展方法 CreateEntryFromFile 来把文件加入到 Zip 压缩包中,该扩展方法在 ZipFileExtensions 类中定义。在 Microsoft Windows 8 Consumer Preview 操作系统中编译和运行:
C:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc ZipCreater.cs -r:System.IO.Compression.dll -r:System.IO.Compression.FileSystem.dll Microsoft (R) Visual C# Compiler version 4.0.30319.17379 for Microsoft (R) .NET Framework 4.5 版权所有 (C) Microsoft Corporation。保留所有权利。 C:\work> ZipCreater
该程序的运行结果是生成一个如下所示的 Zip 压缩包 ZipCreater.zip:
将压缩包解压到指定目录
我们来看看 Unzip.cs:
1 using System;
2 using System.IO.Compression;
3
4 namespace Skyiv.Utils
5 {
6 sealed class Unzip
7 {
8 static void Main(string[] args)
9 {
10 if (args.Length != 2)
11 {
12 Console.WriteLine("Usage: Unzip zip-file-name directory-name");
13 return;
14 }
15 try { ZipFile.ExtractToDirectory(args[0], args[1]); }
16 catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
17 }
18 }
19 }
上述程序的核心内容是第 15 行使用 ZipFile 类的静态方法 ExtractToDirectory 把压缩包中的所有文件解压到指定目录。编译和运行的结果如下所示:
C:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc Unzip.cs -r:System.IO.Compression.FileSystem.dll Microsoft (R) Visual C# Compiler version 4.0.30319.17379 for Microsoft (R) .NET Framework 4.5 版权所有 (C) Microsoft Corporation。保留所有权利。 C:\work> Unzip ZipCreater.zip ZipCreater
将指定目录中的所有文件打包到压缩包中
再看看下面的 Zip.cs:
1 using System;
2 using System.IO.Compression;
3
4 namespace Skyiv.Utils
5 {
6 sealed class Zip
7 {
8 static void Main(string[] args)
9 {
10 if (args.Length != 2)
11 {
12 Console.WriteLine("Usage: Zip zip-file-name directory-name");
13 return;
14 }
15 try { ZipFile.CreateFromDirectory(args[1], args[0]); }
16 catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
17 }
18 }
19 }
上述程序的核内容是第 15 行使用 ZipFile 类的静态方法 CreateFromDirectory 把指定目录中的所有文件打包成一个压缩包。编译和运行的结果如下所示:
C:\work> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc Zip.cs -r:System.IO.Compression.FileSystem.dll Microsoft (R) Visual C# Compiler version 4.0.30319.17379 for Microsoft (R) .NET Framework 4.5 版权所有 (C) Microsoft Corporation。保留所有权利。 C:\work> Zip ZipCreater.2.zip ZipCreater
直接读取网络上的压缩包的内容
我把前面生成的 ZipCreater.zip 文件上传到博客园,然后写一个程序直接从博客园的服务器上读取该压缩包中的 ZipCreater.cs 文件的内容显示在屏幕上:
1 using System;
2 using System.IO;
3 using System.IO.Compression;
4 using System.Net;
5
6 namespace Skyiv.Test
7 {
8 static class ZipTester
9 {
10 static void Main()
11 {
12 using (var zip = new ZipArchive(new Uri(
13 "https://files.cnblogs.com/skyivben/ZipCreater.zip").GetHttpStream()))
14 zip.GetEntry("ZipCreater.cs").Open().CopyTo(Console.OpenStandardOutput());
15 }
16
17 static Stream GetHttpStream(this Uri uri)
18 {
19 return ((HttpWebResponse)((HttpWebRequest)WebRequest.Create(uri)).GetResponse()).GetResponseStream();
20 }
21 }
22 }
上述程序中:
- 第 13 行通过调用在第 17 到 20 行定义的 GetHttpStream 扩展方法得到一个网络流,然后使用该网络流来构造一个 ZipArchive 类。
- 第 14 行调用 ZipArchive 类的 GetEntry 方法得到一个 ZipArchiveEntry 类,然后调用 ZipArchiveEntry 类的 Open 方法就得到所需要的 Stream 类,直接调用Stream 类的 CopyTo 方法写入标准输出。
这个程序的运行结果如下所示:
注意,上述程序仅仅是从网络上读取所需的内容,并没有下载整个压缩包,更没有在本地硬盘上创建临时文件。
以上这些都是 Microsoft .NET Framework 4.5 自身就有的功能,没有使用第三方法的类库,比如 SharpZipLib 之类的东东。
遗憾的是,Microsoft .NET Framework 4.5 只能在 Windows 7、Windows 8、Windows Server 2008 和 Windows Server 8 等操作系统上安装。更早的 Windows 操作系统无法安装 Microsoft .NET Framework 4.5。
参考资料
- Download: Microsoft .NET Framework 4.5 Beta
- MSDN: System.IO.Compression Namespace
- MSDN: ZipArchive Class (System.IO.Compression)
- MSDN: ZipArchiveEntry Class (System.IO.Compression)
- MSDN: ZipFile Class (System.IO.Compression)
- MSDN: ZipFileExtensions Class (System.IO.Compression)
- 使用C#2.0进行文件压缩和解压
- 如何直接处理FTP服务器上的压缩文件?