程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET 4.5 中新提供的壓縮類

.NET 4.5 中新提供的壓縮類

編輯:關於.NET

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/

更對C#資料歡迎訪問http://hovertree.com/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved