.NET 4.5 中新提供的壓縮類

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

Windows8 的開發已經如火如荼開始了,在 Windows8 中提供的 .NET Framework 已經更新到了 4.5 版,其中又增加了一些新的特性,對壓縮文件的支持就是其中之一。

在 4.5 之前,處理壓縮文件,我們經常需要使用第三方的類庫 SharpZipLib, 現在可以直接實現了。

1.準備工作

首先做一下準備工作,需要確保你使用 .NET 4.5 版,可以在項目的屬性窗口中檢查一下。

然后,引用必須的程序集。

程序集有兩個:System.IO.Compression 和 System.IO.Compression.FileSystem.

類似于對文件和目錄的操作,對于壓縮文件也提供了兩種方式:ZipArchive 和 ZipFile,分別對應兩個新增加的類 ZipArchive 和 ZipFile。這兩個類都定義在命名空間 System.IO.Compression 中。

為了后面演示方便,我們定義一個表示壓縮文件路徑的常量。

const string zipFilePath = @"..\..\Sample.zip";

2. 使用 ZipArchive

先看ZipArchive的使用。

2.1 創建壓縮文件

創建一個空的壓縮文件,使用 ZipArchiveMode.Create 創建參數。

// 創建 Zip 文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{

}

使用 WinRaR 打開壓縮文件,可以看到里面沒有文件。

2.2 創建并添加文件

通常,在創建的同時,我們就會加入一些文件,下面的例子中,我們將當前的執行程序文件本身加到壓縮文件中。

復制代碼
// 創建并添加被壓縮文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{
    System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
    string path = assemble.Location;
    string filename = System.IO.Path.GetFileName(path);

    ZipArchiveEntry readMeEntry = archive.CreateEntry(filename);
    using (System.IO.Stream stream = readMeEntry.Open())
    {
        byte[] bytes = System.IO.File.ReadAllBytes(path);
        stream.Write(bytes, 0, bytes.Length);
    }
}
復制代碼

現在,打開壓縮文件,可以看到文件已經被壓縮進來了。

2.3 列出壓縮文件內容

當然,也可以通過程序檢查壓縮文件的內容了。使用 Read 方式就可以了。

復制代碼
// 列出壓縮壓縮文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{

    foreach (var zipArchiveEntry in archive.Entries)
        Console.WriteLine(
            "FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName
        );
}
復制代碼

2.4 提取壓縮文件

當然可以從壓縮文件中提取被壓縮的內容了。

復制代碼
// 讀取其中一個文件的內容
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{
    // 解壓某個文件
    ZipArchiveEntry entry = archive.GetEntry("ZipArchiveSample.exe");
    Console.WriteLine(entry.Name);
    using (System.IO.Stream stream = entry.Open())
    {
        System.IO.Stream output = new FileStream("http://www.cnblogs.com/ZipArchiveSample.exe", FileMode.Create);
        int b = -1;
        while ((b = stream.ReadByte()) != -1)
        {
            output.WriteByte((byte) b);
        }
        output.Close();
    }

}
復制代碼

2.5 更新壓縮文件

在壓縮文件已經創建之后,還可以打開它,繼續添加文件,這就稱為更新了,使用 Update 模式。

復制代碼
// 向現有的壓縮文件中添加文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
{
    // 這里添加當前正在執行的程序文件本身
    System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
    string path = assemble.Location;
    string filename = System.IO.Path.GetFileName( path);

    ZipArchiveEntry readMeEntry = archive.CreateEntry( filename );
    using (System.IO.Stream stream = readMeEntry.Open() )
    {
        byte[] bytes = System.IO.File.ReadAllBytes(path);
        stream.Write(bytes, 0, bytes.Length);
    }

    foreach (var zipArchiveEntry in archive.Entries)
        Console.WriteLine(
            "FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName
        );
}
            
復制代碼

現在壓縮文件中又增加了一個,這可以一個怪異的文件,同一個文件被在壓縮文件中添加了兩次!

3. 使用 ZipFile

除了上邊的基本方法之外,還有一些簡單的使用方法。這涉及到另外一個類:ZipFile。

3.1 創建空壓縮文件

復制代碼
// 刪除壓縮文件
System.IO.File.Delete(zipFilePath);

// 使用 ZipFile 的靜態方法創建壓縮文件,要保證文件沒有存在
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
}
復制代碼

3.2 創建并添加文件

直接添加一個文件的方法。直接使用 CreateEntryFromFile 就可以了。

復制代碼
System.IO.File.Delete(zipFilePath);

// 使用 CreateEntryFromFile 方法添加文件
// 使用 ZipFile 的靜態方法創建壓縮文件
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
    System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
    string path = assemble.Location;
    string filename = System.IO.Path.GetFileName(path);

    zipArchive.CreateEntryFromFile(path, filename);
}
復制代碼

3.3 解壓文件

將壓縮文件解壓到指定的目錄中。

// 解壓文件
ZipFile.ExtractToDirectory(zipFilePath, "../..");

3.4 壓縮一個目錄

還可以直接將一個目錄中所有的文件都壓縮到一個壓縮文件中。

// 壓縮指定目錄中所有文件
System.IO.File.Delete(zipFilePath);
ZipFile.CreateFromDirectory(".", zipFilePath);

你是不是最喜歡這個方法?現在壓縮文件中的文件更多了。

附錄:

SharpZipLib 的下載地址: http://www.icsharpcode.net/OpenSource/SharpZipLib/


思勝.NET 高級培訓 2013-08-29 12:26:32

[新一篇] 31天重構學習筆記重新整理下載

[舊一篇] .NET 程序內存占用問題
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表