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); } } } } |