1. 程式人生 > >C# 利用SharpZipLib生成壓縮包

C# 利用SharpZipLib生成壓縮包

helper 管理 .com rep text har bzip2 reading int

本文通過一個簡單的小例子簡述SharpZipLib壓縮文件的常規用法,僅供學習分享使用,如有不足之處,還請指正。

什麽是SharpZipLib ?

SharpZipLib是一個C#的類庫,主要用來解壓縮Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式實現,可以方便的應用於其他的項目之中。

在工程中引用SharpZipLib

在項目中,點擊項目名稱右鍵-->管理NuGet程序包,打開NuGet包管理器窗口,進行搜索下載即可,如下圖所示:

技術分享圖片

SharpZipLib的關鍵類結構圖

如下所示:

技術分享圖片

涉及知識點:

  • ZipOutputStream 壓縮輸出流,將文件一個接一個的寫入壓縮文檔,此類不是線程安全的。
  • PutNextEntry 開始一個新的ZIP條目,ZipOutputStream中的方法。
  • ZipEntry 一個ZIP文件中的條目,可以理解為壓縮包裏面的一個文件夾/文件。
  • ZipInputStream 解壓縮輸出流,從壓縮包中一個接一個的讀出文檔。
  • GetNextEntry 讀出ZIP條目,ZipInputStream中的方法。

示例效果圖:

關於解壓縮小例子的示例效果圖,如下:

技術分享圖片

核心代碼

技術分享圖片
  1 using ICSharpCode.SharpZipLib.Checksum;
  2 using ICSharpCode.SharpZipLib.Zip;
  3 using System;
4 using System.Collections.Generic; 5 using System.IO; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace DemoZip 11 { 12 class ZipHelper 13 { 14 private string rootPath = string.Empty; 15 16 #region 壓縮 17 18 ///
<summary> 19 /// 遞歸壓縮文件夾的內部方法 20 /// </summary> 21 /// <param name="folderToZip">要壓縮的文件夾路徑</param> 22 /// <param name="zipStream">壓縮輸出流</param> 23 /// <param name="parentFolderName">此文件夾的上級文件夾</param> 24 /// <returns></returns> 25 private bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName) 26 { 27 bool result = true; 28 string[] folders, files; 29 ZipEntry ent = null; 30 FileStream fs = null; 31 Crc32 crc = new Crc32(); 32 33 try 34 { 35 string entName = folderToZip.Replace(this.rootPath, string.Empty)+"/"; 36 //Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/") 37 ent = new ZipEntry(entName); 38 zipStream.PutNextEntry(ent); 39 zipStream.Flush(); 40 41 files = Directory.GetFiles(folderToZip); 42 foreach (string file in files) 43 { 44 fs = File.OpenRead(file); 45 46 byte[] buffer = new byte[fs.Length]; 47 fs.Read(buffer, 0, buffer.Length); 48 ent = new ZipEntry(entName + Path.GetFileName(file)); 49 ent.DateTime = DateTime.Now; 50 ent.Size = fs.Length; 51 52 fs.Close(); 53 54 crc.Reset(); 55 crc.Update(buffer); 56 57 ent.Crc = crc.Value; 58 zipStream.PutNextEntry(ent); 59 zipStream.Write(buffer, 0, buffer.Length); 60 } 61 62 } 63 catch 64 { 65 result = false; 66 } 67 finally 68 { 69 if (fs != null) 70 { 71 fs.Close(); 72 fs.Dispose(); 73 } 74 if (ent != null) 75 { 76 ent = null; 77 } 78 GC.Collect(); 79 GC.Collect(1); 80 } 81 82 folders = Directory.GetDirectories(folderToZip); 83 foreach (string folder in folders) 84 if (!ZipDirectory(folder, zipStream, folderToZip)) 85 return false; 86 87 return result; 88 } 89 90 /// <summary> 91 /// 壓縮文件夾 92 /// </summary> 93 /// <param name="folderToZip">要壓縮的文件夾路徑</param> 94 /// <param name="zipedFile">壓縮文件完整路徑</param> 95 /// <param name="password">密碼</param> 96 /// <returns>是否壓縮成功</returns> 97 public bool ZipDirectory(string folderToZip, string zipedFile, string password) 98 { 99 bool result = false; 100 if (!Directory.Exists(folderToZip)) 101 return result; 102 103 ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile)); 104 zipStream.SetLevel(6); 105 if (!string.IsNullOrEmpty(password)) zipStream.Password = password; 106 107 result = ZipDirectory(folderToZip, zipStream, ""); 108 109 zipStream.Finish(); 110 zipStream.Close(); 111 112 return result; 113 } 114 115 /// <summary> 116 /// 壓縮文件夾 117 /// </summary> 118 /// <param name="folderToZip">要壓縮的文件夾路徑</param> 119 /// <param name="zipedFile">壓縮文件完整路徑</param> 120 /// <returns>是否壓縮成功</returns> 121 public bool ZipDirectory(string folderToZip, string zipedFile) 122 { 123 bool result = ZipDirectory(folderToZip, zipedFile, null); 124 return result; 125 } 126 127 /// <summary> 128 /// 壓縮文件 129 /// </summary> 130 /// <param name="fileToZip">要壓縮的文件全名</param> 131 /// <param name="zipedFile">壓縮後的文件名</param> 132 /// <param name="password">密碼</param> 133 /// <returns>壓縮結果</returns> 134 public bool ZipFile(string fileToZip, string zipedFile, string password) 135 { 136 bool result = true; 137 ZipOutputStream zipStream = null; 138 FileStream fs = null; 139 ZipEntry ent = null; 140 141 if (!File.Exists(fileToZip)) 142 return false; 143 144 try 145 { 146 fs = File.OpenRead(fileToZip); 147 byte[] buffer = new byte[fs.Length]; 148 fs.Read(buffer, 0, buffer.Length); 149 fs.Close(); 150 151 fs = File.Create(zipedFile); 152 zipStream = new ZipOutputStream(fs); 153 if (!string.IsNullOrEmpty(password)) zipStream.Password = password; 154 ent = new ZipEntry(Path.GetFileName(fileToZip)); 155 zipStream.PutNextEntry(ent); 156 zipStream.SetLevel(6); 157 158 zipStream.Write(buffer, 0, buffer.Length); 159 160 } 161 catch 162 { 163 result = false; 164 } 165 finally 166 { 167 if (zipStream != null) 168 { 169 zipStream.Finish(); 170 zipStream.Close(); 171 } 172 if (ent != null) 173 { 174 ent = null; 175 } 176 if (fs != null) 177 { 178 fs.Close(); 179 fs.Dispose(); 180 } 181 } 182 GC.Collect(); 183 GC.Collect(1); 184 185 return result; 186 } 187 188 /// <summary> 189 /// 壓縮文件 190 /// </summary> 191 /// <param name="fileToZip">要壓縮的文件全名</param> 192 /// <param name="zipedFile">壓縮後的文件名</param> 193 /// <returns>壓縮結果</returns> 194 public bool ZipFile(string fileToZip, string zipedFile) 195 { 196 bool result = ZipFile(fileToZip, zipedFile, null); 197 return result; 198 } 199 200 /// <summary> 201 /// 壓縮文件或文件夾 202 /// </summary> 203 /// <param name="fileToZip">要壓縮的路徑</param> 204 /// <param name="zipedFile">壓縮後的文件名</param> 205 /// <param name="password">密碼</param> 206 /// <returns>壓縮結果</returns> 207 public bool Zip(string fileToZip, string zipedFile, string password) 208 { 209 bool result = false; 210 if (Directory.Exists(fileToZip)) 211 { 212 this.rootPath = Path.GetDirectoryName(fileToZip); 213 result = ZipDirectory(fileToZip, zipedFile, password); 214 } 215 else if (File.Exists(fileToZip)) 216 { 217 this.rootPath = Path.GetDirectoryName(fileToZip); 218 result = ZipFile(fileToZip, zipedFile, password); 219 } 220 return result; 221 } 222 223 /// <summary> 224 /// 壓縮文件或文件夾 225 /// </summary> 226 /// <param name="fileToZip">要壓縮的路徑</param> 227 /// <param name="zipedFile">壓縮後的文件名</param> 228 /// <returns>壓縮結果</returns> 229 public bool Zip(string fileToZip, string zipedFile) 230 { 231 bool result = Zip(fileToZip, zipedFile, null); 232 return result; 233 234 } 235 236 #endregion 237 238 #region 解壓 239 240 /// <summary> 241 /// 解壓功能(解壓壓縮文件到指定目錄) 242 /// </summary> 243 /// <param name="fileToUnZip">待解壓的文件</param> 244 /// <param name="zipedFolder">指定解壓目標目錄</param> 245 /// <param name="password">密碼</param> 246 /// <returns>解壓結果</returns> 247 public bool UnZip(string fileToUnZip, string zipedFolder, string password) 248 { 249 bool result = true; 250 FileStream fs = null; 251 ZipInputStream zipStream = null; 252 ZipEntry ent = null; 253 string fileName; 254 255 if (!File.Exists(fileToUnZip)) 256 return false; 257 258 if (!Directory.Exists(zipedFolder)) 259 Directory.CreateDirectory(zipedFolder); 260 261 try 262 { 263 zipStream = new ZipInputStream(File.OpenRead(fileToUnZip)); 264 if (!string.IsNullOrEmpty(password)) zipStream.Password = password; 265 while ((ent = zipStream.GetNextEntry()) != null) 266 { 267 if (!string.IsNullOrEmpty(ent.Name)) 268 { 269 fileName = Path.Combine(zipedFolder, ent.Name); 270 fileName = fileName.Replace(/, \\);//change by Mr.HopeGi 271 272 if (fileName.EndsWith("\\")) 273 { 274 Directory.CreateDirectory(fileName); 275 continue; 276 } 277 278 fs = File.Create(fileName); 279 int size = 2048; 280 byte[] data = new byte[size]; 281 while (true) 282 { 283 size = zipStream.Read(data, 0, data.Length); 284 if (size > 0) 285 fs.Write(data, 0, data.Length); 286 else 287 break; 288 } 289 } 290 } 291 } 292 catch 293 { 294 result = false; 295 } 296 finally 297 { 298 if (fs != null) 299 { 300 fs.Close(); 301 fs.Dispose(); 302 } 303 if (zipStream != null) 304 { 305 zipStream.Close(); 306 zipStream.Dispose(); 307 } 308 if (ent != null) 309 { 310 ent = null; 311 } 312 GC.Collect(); 313 GC.Collect(1); 314 } 315 return result; 316 } 317 318 /// <summary> 319 /// 解壓功能(解壓壓縮文件到指定目錄) 320 /// </summary> 321 /// <param name="fileToUnZip">待解壓的文件</param> 322 /// <param name="zipedFolder">指定解壓目標目錄</param> 323 /// <returns>解壓結果</returns> 324 public bool UnZip(string fileToUnZip, string zipedFolder) 325 { 326 bool result = UnZip(fileToUnZip, zipedFolder, null); 327 return result; 328 } 329 330 #endregion 331 } 332 }
View Code

備註

關於生成壓縮的方法還有很多,如通過命令行調用winrar的執行文件,SharpZipLib只是方法之一。

關於SharpZipLib的的API文檔,可參看鏈接。

關於源碼下載鏈接

C# 利用SharpZipLib生成壓縮包