|
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
namespace ZipFile
{
/// <summary>
/// 壓縮檔
/// </summary>
public class ZipHelp
{
public string ZipName { get; set; }
/// <summary>
/// 壓縮檔夾
/// </summary>
/// <param name="zipSourcePath">需要壓縮的檔案夾路徑(全路徑)</param>
/// <param name="zipToFilePath">壓縮後儲存的路徑且必須帶尾碼名如:D:\aa.zip(如果為空白字元則預設儲存到同級檔案夾名稱為源檔案名稱)</param>
public void ZipFileMain(string zipSourcePath,string zipToFilePath)
{
string[] filenames = Directory.GetFiles(zipSourcePath);
ZipName = zipSourcePath.Substring(zipSourcePath.LastIndexOf("\")+1);
//定義壓縮更目錄對象
Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(zipToFilePath.Equals("")? zipSourcePath+".zip":zipToFilePath));
s.SetLevel(6); // 設定壓縮層級
//遞迴壓縮檔夾下的所有檔案和字檔案夾
AddDirToDir(crc, s,zipSourcePath);
s.Finish();
s.Close();
}
/// <summary>
/// 壓縮單個檔案
/// </summary>
/// <param name="zipSourcePath">需要壓縮的檔案路徑(全路徑)</param>
/// <param name="zipToFilePath">壓縮後儲存的檔案路徑(如果是Null 字元則預設壓縮到同目錄下檔案名稱為源檔案名稱)</param>
public void ZipByFile(string zipSourcePath,string zipToFilePath)
{
//定義壓縮更目錄對象
Crc32 crc = new Crc32();
string dirName = zipSourcePath.Substring(zipSourcePath.LastIndexOf("\") + 1, zipSourcePath.LastIndexOf(".") - (zipSourcePath.LastIndexOf("\") + 1)) + ".zip";
ZipOutputStream s = new ZipOutputStream(File.Create(zipToFilePath.Equals("")? zipSourcePath.Substring(0,zipSourcePath.LastIndexOf("\"))+"\"+ dirName:zipToFilePath));
s.SetLevel(6); // 設定壓縮層級
AddFileToDir(crc,s,zipSourcePath,0);
s.Finish();
s.Close();
}
/// <summary>
/// 壓縮單個檔案到指定壓縮檔夾下(內部調用)
/// </summary>
/// <param name="crc"></param>
/// <param name="s"></param>
/// <param name="file">檔案路徑</param>
public void AddFileToDir(Crc32 crc,ZipOutputStream s,string file,int dotype)
{
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string filename="";
if (dotype == 0)
filename = file.Substring(file.LastIndexOf("\") + 1);
else
filename = file.Substring(file.IndexOf(ZipName));
ZipEntry entry = new ZipEntry(filename);
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
/// <summary>
/// 遞迴檔案夾層級(內部調用)
/// </summary>
/// <param name="crc"></param>
/// <param name="s"></param>
/// <param name="file"></param>
public void AddDirToDir(Crc32 crc, ZipOutputStream s, string file)
{
//添加此檔案夾下的檔案
string[] files = Directory.GetFiles(file);
foreach (string i in files)
{
AddFileToDir(crc,s,i,1);
}
//查詢此檔案夾下的子檔案夾
string[] dirs=Directory.GetDirectories(file);
foreach (string i in dirs)
{
AddDirToDir(crc,s,i);
}
}
}
} |