DotNetZip
DotNetZip為一輕便又易於使用的開放源碼壓縮函式庫,開發人員可透過DotNetZip函式庫來做壓縮資料、讀取壓縮資料、更新壓縮資料、與列出壓縮檔資料內容等功能,能支援壓縮檔密碼保護、Zip64格式、產生自解壓縮檔、與Unicode編碼。
DotNetZip庫函式下載解壓後會看到主要有Ionic.Zip.dll、Ionic.Zip.CF.dll、與Ionic.Zip.Reduced.dll這三個Dll。Ionic.Zip.dll為PC程式所要使用的參考組件,Ionic.Zip.CF.dll為行動裝置所要使用的參考組件,Ionic.Zip.Reduced.dll則是精簡後的參考組件,少了產生自解壓縮檔的功能,檔案大小會比較小,這邊可依自己的需求將參考組件加入參考。
在前置的準備上,除需將參考組件加入參考外,我們還需將Ionic.Zip命名空間加入。而在使用上,主要要使用的是ZipFile這個類別,這邊將其較重要的成員列表如下:
Property
Name | Description |
Password | 設定壓縮檔密碼,若無密碼可不設定或設定null。 |
Comment | 取得或設定壓縮檔註解。 |
CompressionLevel | 取得或設定壓縮等級。 |
Count | 取得壓縮檔內被壓縮的檔案數量。 |
MaxOutputSegmentSize | 取得或設定最大輸出大小,設定完後壓縮時會依此設定值下去分割壓縮檔案。其可接受的輸入區間65536~2147483647。 |
Method
Name | Description |
AddFile | 加入指定檔案至壓縮檔。 |
AddDirectory | 加入指定目錄至壓縮檔。 |
Save | 儲存壓縮檔。 |
UpdateFile | 更新檔案。 |
RemoveEntry | 移除壓縮檔內指定的元素。 |
ExtractAll | 解壓縮所有檔案。 |
SaveSelfExtractor | 儲存自解壓縮檔。 |
Event
Name | Description |
SaveProgress | 儲存進度。 |
ExtractProgress | 解壓縮進度。 |
在壓縮時,主要是帶入指定壓縮檔的檔名到建構子中建立物件實體,透過屬性設定一些細部資訊,透過AddFile、AddDirectory、AddFileFromString...等方法的呼叫將要壓縮的檔案放入壓縮檔中,再透過Save方法產生對應的壓縮檔案。
{
using (ZipFile zip = new ZipFile(archiveFile))
{
zip.Password = archivePassword;
zip.Comment = archiveCommon;
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
//zip.MaxOutputSegmentSize = 65536;
zip.AddFiles(System.IO.Directory.GetFiles(zipPath), string.Empty);
zip.Save();
}
}
或是改呼叫SaveSelfExtractor方法產生自解壓縮檔案。
{
using (ZipFile zip = new ZipFile())
{
zip.Password = archivePassword;
zip.Comment = archiveCommon;
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
//zip.MaxOutputSegmentSize = 65536;
zip.AddFiles(System.IO.Directory.GetFiles(zipPath), string.Empty);
zip.SaveSelfExtractor(archiveFile, SelfExtractorFlavor.WinFormsApplication);
}
}
要讀取壓縮檔資訊時,可帶入指定壓縮檔的檔名到建構子中建立物件實體,透過屬性取得壓縮檔的細部資訊,或透過ZipEntry取得被壓縮的檔案其細部資訊。
{
using (ZipFile zip = new ZipFile(archiveFile))
{
Console.WriteLine(zip.Comment);
Console.WriteLine(zip.CompressionLevel);
Console.WriteLine(zip.Count.ToString());
foreach (ZipEntry item in zip)
{
Console.WriteLine(item.FileName);
}
}
}
解壓縮時,則是帶入指定壓縮檔的檔名到建構子中建立物件實體,透過ExtractAll解壓縮壓縮檔內全部的內容。
{
using (ZipFile zip = new ZipFile(archiveFile))
{
zip.ExtractAll(targetPath);
}
}
或是透過ZipFile.Entries找到指定的ZipEntry,並呼叫ZipEntry.Extract去做解壓縮的動作。
{
using (ZipFile zip = new ZipFile(archiveFile))
{
var zipEntry = (from item in zip.Entries where item.FileName == fileInArchive select item).FirstOrDefault();
if (zipEntry != null)
zipEntry.Extract(targetPath);
}
}