民初思韻網

加入收藏   設為首頁
選擇語言   簡體中文
你好,請 登陸 或 注冊
首頁 人文思韻 傳奇人物 歷史思潮 時代作品 話題討論 國民思韻 民初捐助 賬戶管理
  搜索  
    人文精神 >>> 技術的天空 溫和的思緒
字體    

.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/

2013-08-29 12:26

歡迎訂閱我們的微信公眾賬號!
春秋茶館訂閱號
微信號 season-tea(春秋茶館)
每天分享一篇科技/遊戲/人文類的資訊,點綴生活,啟迪思想,探討古典韻味。
  清末民初歷史人物  民初人物
傳奇人物傳記 風華絕代 物華天寶
此間選取古往今來傳奇人物的傳記與軼事,事不分大小,趣味為先,立意新穎,足以激越古今。
清末民初學者大師
梁啟超(1873年2月23日-1929年1月19日),字卓如、任甫,號任公、飲冰子,別署飲冰室主人,廣東新會人,中國近代思想家、政治活動家、學者、政治評論家、戊戌變法領袖....
資助民初精神網
        回頂部     寫評論

 
評論集
暫無評論!
發表評論歡迎你的評論
昵稱:     登陸  註冊
主頁:  
郵箱:  (僅管理員可見)

驗證:   验证码(不區分大小寫)  
© 2011   民初思韻網-清末民初傳奇時代的發現與復興   版權所有   加入收藏    設為首頁    聯繫我們    1616導航