壓縮 與 解壓類如下 (注:僅支持 .zip 的壓縮與解壓) [csharp] using System; using System.Collections.Generic; using System.Linq; using System.Web; using ICSharpCode.SharpZipLib.Zip; using System.IO; using ICSharpCode.SharpZipLib.Checksums; using System.Text; namespace 文件壓縮與解壓 { public class ZipClass { #region 壓縮文件 /// <summary> /// 壓縮文件 /// </summary> /// <param name="FileToZip">待壓縮的文件</param> /// <param name="ZipedFile">壓縮後的文件</param> /// <param name="password">壓縮密碼</param> private void ZipFile(string FileToZip, string ZipedFile,string password) { //如果文件沒有找到,則報錯 if (!System.IO.File.Exists(FileToZip)) { throw new System.IO.FileNotFoundException("文件 " + FileToZip + "不存在!"); } //取得待壓縮文件流 System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read); //創建壓縮後的文件 System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile); //創建新的ZIP輸出流 ZipOutputStream ZipStream = new ZipOutputStream(ZipFile); // 每一個被壓縮的文件都用ZipEntry表示,需要為每一個壓縮後的文件設置名稱 ZipEntry ZipEntry = new ZipEntry("ZippedFile"); //設置每一個ZipEntry對象 ZipStream.PutNextEntry(ZipEntry); // 為後續的 DEFLATED 條目設置壓縮級別。 0 -9 ZipStream.SetLevel(6); //設置解壓密碼 ZipStream.Password = password; //每次寫入1024個字節 byte[] buffer = new byte[1024]; int size = 0; //已寫入壓縮流的字節數 try { //如果沒有寫入完成 while (size < StreamToZip.Length) { //將文件內容寫入buffer int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); //將字節寫入壓縮流 ZipStream.Write(buffer, 0, sizeRead); size += sizeRead; } } catch (System.Exception ex) { throw ex; } //完成寫入 ZIP 輸出流的內容,無需關閉底層流。 ZipStream.Finish(); //關閉 ZIP 輸出流和正在過濾的流。 ZipStream.Close(); //關閉文件流 StreamToZip.Close(); } #endregion 壓縮文件 #region 壓縮文件夾(私有不被外部調用) /// <summary> /// 壓縮文件夾 /// </summary> /// <param name="FileToZip">待壓縮的文件夾</param> /// <param name="ZipStream">壓縮文件流</param> /// <param name="ParentFolderName">壓縮父目錄</param> private void ZipFolder(string FolderToZip, ZipOutputStream ZipStream, string ParentFolderName) { //如果文件夾沒有找到,則報錯 if (!System.IO.Directory.Exists(FolderToZip)) { throw new System.IO.FileNotFoundException("文件路徑 " + FolderToZip + "不存在!"); } //校驗類 Crc32 crc = new Crc32(); //取得路徑下所有文件全路徑 string[] filenames = Directory.GetFiles(FolderToZip); //循環壓縮文件 foreach (string file in filenames) { //打開要的壓縮文件 if (!System.IO.File.Exists(file)) //判斷文件是否存在 { throw new System.IO.FileNotFoundException("待壓縮的文件 " + file + "不存在!"); } //取得待壓縮文件流 FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; //將文件寫入字節數組 fs.Read(buffer, 0, buffer.Length); //壓縮文件後的目錄 string ZipPath = Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)); ZipEntry entry = new ZipEntry(ZipPath); entry.DateTime = DateTime.Now; //設置size entry.Size = fs.Length; //關閉文件流 fs.Close(); // 將 CRC-32 重置為初始值。 crc.Reset(); // 使用指定的字節數組更新校驗和。 crc.Update(buffer); // 設置 CRC-32 值。 entry.Crc = crc.Value; //設置每一個ZipEntry對象 ZipStream.PutNextEntry(entry); //將字節寫入壓縮流 ZipStream.Write(buffer, 0, buffer.Length); } //取得路徑下所有文件夾全路徑 string[] folders = Directory.GetDirectories(FolderToZip); //循環壓縮文件夾下層目錄的文件 foreach (string folder in folders) { ZipFolder(folder, ZipStream, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))); } } #endregion 壓縮文件夾 #region 壓縮文件夾 (可被外部應用) /// <summary> /// 壓縮文件夾 /// </summary> /// <param name="FileToZip">待壓縮的文件夾</param> /// <param name="ZipStream">壓縮後的文件</param> /// <param name="password">壓縮密碼</param> public void ZipFolder(string FolderToZip, string ZipedFile, string password) { // 解決中文亂碼 Encoding gbk = Encoding.GetEncoding("gbk"); ZipConstants.DefaultCodePage = gbk.CodePage; //創建壓縮後的文件 System.IO.FileStream zipFile = System.IO.File.Create(ZipedFile); //創建新的ZIP輸出流 ZipOutputStream ZipStream = new ZipOutputStream(zipFile); //設置解壓密碼 ZipStream.Password = password; // 為後續的 DEFLATED 條目設置壓縮級別。 0 -9 ZipStream.SetLevel(6); //壓縮文件夾 ZipFolder(FolderToZip, ZipStream, ""); //完成寫入 ZIP 輸出流的內容,無需關閉底層流。 ZipStream.Finish(); //關閉 ZIP 輸出流和正在過濾的流。 ZipStream.Close(); } #endregion 壓縮文件夾 #region 壓縮文件(根據路徑 自動判定是文件夾還是文件) /// <summary> /// 壓縮文件 /// </summary> /// <param name="FileToZip">待壓縮的文件(夾)路徑</param> /// <param name="ZipStream">壓縮後的文件</param> /// <param name="password">壓縮密碼</param> public void ZipFileMain(string FileToZip, string ZipedFile, string password) { //為壓縮文件夾 if (Directory.Exists(FileToZip)) { //壓縮文件夾 ZipFolder(FileToZip, ZipedFile, password); } //為壓縮文件 else if (File.Exists(FileToZip)) { // //壓縮文件 ZipFile(FileToZip, ZipedFile, password); } else { throw new System.IO.FileNotFoundException("待壓縮的文件目錄 " + FileToZip + "出錯!"); } } #endregion 壓縮文件(根據路徑 自動判定是文件夾還是文件) #region 解壓文件 /// <summary> /// 解壓 /// </summary> /// <param name="args"> // args[0] = Server.MapPath("ZIP") + "\\f12Zip.zip"; //待解壓的文件 // args[1]=Server.MapPath("UPZIP\\");//解壓後放置的目標目錄 // 或 // args[0] = "D:\\f12Zip.zip"; //待解壓的文件 // args[1]="D:\\UPZIP\\"); //解壓後放置的目標目錄 //</param> /// <summary> /// 解壓 /// </summary> /// <param name="UpZipFile">待解壓文件</param> /// <param name="ZipToFile">解壓後放置的目標目錄</param> /// <param name="password">解壓密碼</param> public void UnZip(string UpZipFile, string ZipToFile,string password) { if (!System.IO.File.Exists(UpZipFile)) { throw new System.IO.FileNotFoundException("文件 " + UpZipFile + "不存在!"); } //創建新的ZIP輸入流 ZipInputStream ZipStream = new ZipInputStream(File.OpenRead(UpZipFile)); //設置解壓密碼 ZipStream.Password = password; ZipEntry theEntry; while ((theEntry = ZipStream.GetNextEntry()) != null) { //取得解壓後的目錄 string directoryName = Path.GetDirectoryName(ZipToFile); //取得解壓文件下的文件名 string fileName = Path.GetFileName(theEntry.Name); //取得子目錄 string filepath = Path.GetDirectoryName(theEntry.Name); //取得解壓文件名 //如 xxxxx.zip string ZipFile = Path.GetFileName(UpZipFile); //去掉文件名後綴 xxxxx string zipfile = ZipFile.Split('.')[0]; //創建解壓後文件目錄 string filePath = directoryName + "\\" + zipfile + "\\" + filepath + "\\"; Directory.CreateDirectory(filePath); if (fileName != String.Empty) { //解壓文件到指定的目錄 FileStream streamWriter = File.Create(filePath + "\\" + fileName); int size = 2048; byte[] data = new byte[2048]; while (true) { size = ZipStream.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } streamWriter.Close(); } } ZipStream.Close(); } #endregion 解壓文件 } } 調用方式: string filepath = Server.MapPath("freezip"); string strtxtPath = filepath; //壓縮文件夾 string strzipPath = Server.MapPath("ZIP") + "\\f12Zip.zip"; // strtxtPath= "C:\\unzipped\\";//待壓縮文件目錄 // strzipPath="C:\\zip\\a.zip"; //壓縮後的目標文件 ZipClass zc = new ZipClass(); zc.ZipFileMain(strtxtPath,strzipPath,""); //壓縮文件 解壓相似。