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 壓縮包很easy。例如以下 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 文件上傳到博客園,然后寫一個程序直接從博客園的server上讀取該壓縮包中的 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 "http://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 方法寫入標准輸出。
這個程序的執行結果例如以下所看到的: