淺談 ZipArchive 類


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:

ZipFile

將壓縮包解壓到指定目錄

我們來看看 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 "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 方法寫入標准輸出。

這個程序的運行結果如下所示:

ZipTester

注意,上述程序僅僅是從網絡上讀取所需的內容,並沒有下載整個壓縮包,更沒有在本地硬盤上創建臨時文件。

以上這些都是 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。

參考資料

  1. Download: Microsoft .NET Framework 4.5 Beta
  2. MSDN: System.IO.Compression Namespace
  3. MSDN: ZipArchive Class (System.IO.Compression)
  4. MSDN: ZipArchiveEntry Class (System.IO.Compression)
  5. MSDN: ZipFile Class (System.IO.Compression)
  6. MSDN: ZipFileExtensions Class (System.IO.Compression)
  7. 使用C#2.0進行文件壓縮和解壓
  8. 如何直接處理FTP服務器上的壓縮文件?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM