2012年10月1日 星期一

利用DotNetZip打包壓縮

最近系統需要提供使用者將多個檔案打包壓縮下載,經由google查詢後找出可利用DotNetZip完成此需求,以下為使用心得

首先我們先下載DotNetZip,解壓縮後將Ionic.Zip.dll放置到Web應用程式的Bin目錄下


接著在cs檔上方using
using System.IO;
using System.Text;
using Ionic.Zip;

由於多人同時打包壓縮下載可能會發生檔名衝突的問題,為了解決這個問題我們為個別使用者建立以使用者帳號為名的目錄,做為未來存放壓縮檔的位置,這裡以使用者Ken為例。
if (!Directory.Exists(@"D:\upload\tmp\Ken"))
{
    Directory.CreateDirectory(@"D:\upload\tmp\Ken");
}

因為每次挑選的檔案不同,為了簡化壓縮檔的命名規則,統一命名為MyZip.zip,在檔案下載前清空使用者目錄下的壓縮檔
DirectoryInfo directory = new DirectoryInfo(@"D:\upload\tmp\Ken");
foreach (FileInfo file in directory.GetFiles()) 
{
    file.Delete();
}

接著輸入未來要存放壓縮檔的位置及檔名,並輸入要加入壓縮檔的檔案,若檔案不存在則會出現System.IO.FileNotFoundException,所以必須檢查檔案是否存在,這裡的例子以a.txt、b.txt做為要加入壓縮檔的檔案。
ZipFile zip = new ZipFile(@"D:\upload\tmp\Ken\MyZip.zip", Encoding.UTF8);
if (File.Exists(@"D:\upload\a.txt"))
{
    zip.AddFile(@"D:\upload\a.txt", "");
}
if (File.Exists(@"D:\upload\b.txt"))
{
    zip.AddFile(@"D:\upload\b.txt", "");
}
zip.Save();

最後輸入下載的檔名及壓縮檔的位置及名稱即可。
Response.AddHeader("Content-Disposition", "attachment;filename=MyZip.zip");
Response.ContentType = "application/octet-stream";
Response.TransmitFile(@"D:\upload\tmp\Ken\MyZip.zip");