2009年8月25日

C# .NET ZIP Compress

Step 1 : Download ICSharpCode.SharpZipLib.zip file.
Step 2 : Extract ICSharpCode.SharpZipLib.dll from the zip file.
Step 3 : Add reference to the project.
Step 4 : Add new class file on the project.
Step 5 : Copy and paste the code to the class.
Step 6 : Now, you can use the class function in the project.


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;

namespace YCCS.Core
{
public class Zip
{
/// <summary>
/// 壓縮整個資料夾
/// </summary>
/// <param name="SourceDir">要壓縮的資料夾(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <param name="Password">密碼</param>
/// <param name="BackupOldFile">是否備份舊檔案</param>
public void ZipDir(string SourceDir, string TargetFile, string Password, bool BackupOldFile)
{
ICSharpCode.SharpZipLib.Zip.FastZip oZipDir = new ICSharpCode.SharpZipLib.Zip.FastZip();
try
{
if (!Directory.Exists(SourceDir))
{
throw new Exception("資料夾不存在!");
}

if (BackupOldFile == true)
{
//判斷要產生的ZIP檔案是否存在
if (File.Exists(TargetFile) == true)
{
//原本的檔案存在,把他ReName
File.Copy(TargetFile, TargetFile + "-" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".back");
File.Delete(TargetFile);
}
}

if (Password != "")
{
oZipDir.Password = Password;
}
oZipDir.CreateZip(TargetFile, SourceDir, true, "");
}
catch
{
throw;
}
}

/// <summary>
/// 壓縮整個資料夾
/// </summary>
/// <param name="SourceDir">要壓縮的資料夾(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <param name="Password">密碼</param>
public void ZipDir(string SourceDir, string TargetFile, string Password)
{
this.ZipDir(SourceDir, TargetFile, Password, true);
}

/// <summary>
/// 壓縮整個資料夾
/// </summary>
/// <param name="SourceDir">要壓縮的資料夾(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
public void ZipDir(string SourceDir, string TargetFile)
{
this.ZipDir(SourceDir, TargetFile, "", true);
}

/// <summary>
/// 壓縮檔案
/// </summary>
/// <param name="SourceFiles">要壓縮的檔案s(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <param name="Password">密碼</param>
/// <param name="BackupOldFile">是否備份舊檔案</param>
public void ZipFiles(string[] SourceFiles, string TargetFile, string Password, bool BackupOldFile)
{
try
{
if (SourceFiles == null || SourceFiles.Length <= 0)
{
throw new Exception("並未傳入檔案完整路徑");
}

for (int i = 0; i < SourceFiles.Length; i++)
{
if (File.Exists(SourceFiles[i]) == false)
{
throw new Exception("要壓縮的檔案【" + SourceFiles[i] + "】不存在");
}
}

if (BackupOldFile == true)
{
//判斷要產生的ZIP檔案是否存在
if (File.Exists(TargetFile) == true)
{
//原本的檔案存在,把他ReName
File.Copy(TargetFile, TargetFile + "-" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".back");
File.Delete(TargetFile);
}
}

ZipOutputStream zs = new ZipOutputStream(File.Create(TargetFile));
zs.SetLevel(9); //壓縮比
if (Password != "")
{
zs.Password = Password;
}

for (int i = 0; i < SourceFiles.Length; i++)
{
FileStream s = File.OpenRead(SourceFiles[i]);
byte[] buffer = new byte[s.Length];
s.Read(buffer, 0, buffer.Length);
ZipEntry Entry = new ZipEntry(Path.GetFileName(SourceFiles[i]));
Entry.DateTime = DateTime.Now;
Entry.Size = s.Length;
s.Close();
zs.PutNextEntry(Entry);
zs.Write(buffer, 0, buffer.Length);
}
zs.Finish();
zs.Close();
}
catch
{
throw;
}
}

/// <summary>
/// 壓縮檔案
/// </summary>
/// <param name="SourceFiles">要壓縮的檔案s(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <param name="Password">密碼</param>
public void ZipFiles(string[] SourceFiles, string TargetFile, string Password)
{
this.ZipFiles(SourceFiles, TargetFile, Password, true);
}

/// <summary>
/// 壓縮檔案
/// </summary>
/// <param name="SourceFiles">要壓縮的檔案s(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
public void ZipFiles(string[] SourceFiles, string TargetFile)
{
this.ZipFiles(SourceFiles, TargetFile, "", true);
}

/// <summary>
/// 壓縮單一檔案
/// </summary>
/// <param name="SourceFile">要壓縮的檔案(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <param name="Password">密碼</param>
/// <param name="BackupOldFile">是否備份舊檔案</param>
public void ZipFile(string SourceFile, string TargetFile, string Password, bool BackupOldFile)
{
this.ZipFiles(new string[] { SourceFile }, TargetFile, Password, BackupOldFile);
}

/// <summary>
/// 壓縮單一檔案
/// </summary>
/// <param name="SourceFile">要壓縮的檔案(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <param name="Password">密碼</param>
public void ZipFile(string SourceFile, string TargetFile, string Password)
{
this.ZipFile(SourceFile, TargetFile, Password, true);
}

/// <summary>
/// 壓縮單一檔案
/// </summary>
/// <param name="SourceFile">要壓縮的檔案(完整路徑)</param>
/// <param name="TargetFile">要產生的Zip檔案(完整路徑檔名)</param>
/// <returns></returns>
public void ZipFile(string SourceFile, string TargetFile)
{
this.ZipFile(SourceFile, TargetFile, "",true);
}

/// <summary>
/// 解壓縮
/// </summary>
/// <param name="SourceFile">要解壓縮的Zip檔案(完整路徑檔名) </param>
/// <param name="TargetDir">解壓縮後存放的資料夾路徑(完整路徑) </param>
/// <param name="Password">密碼</param>
public void ExtractZip(string SourceFile, string TargetDir, string Password)
{
ICSharpCode.SharpZipLib.Zip.FastZip oZip = new ICSharpCode.SharpZipLib.Zip.FastZip();
try
{
//判斷ZIP檔案是否存在
if (File.Exists(SourceFile) == false)
{
throw new Exception("要解壓縮的檔案【" + SourceFile + "】不存在,無法執行");
}
if (Password != "")
{
oZip.Password = Password;
}
oZip.ExtractZip(SourceFile, TargetDir, "");
}
catch
{
throw;
}
}

/// <summary>
/// 解壓縮
/// </summary>
/// <param name="SourceFile">要解壓縮的Zip檔案(完整路徑檔名) </param>
/// <param name="TargetDir">解壓縮後存放的資料夾路徑(完整路徑) </param>
public void ExtractZip(string SourceFile, string TargetDir)
{
this.ExtractZip(SourceFile, TargetDir, "");
}
}
}

沒有留言:

張貼留言