工作中我們很多時候需要進行對文件進行壓縮,比較通用的壓縮的dll就是ICSharpCode.SharpZipLib.dll,廢話不多了,網上也有很多的資料,我將其最常用的兩個函數整理了一下,提供了一個通用的類,這樣在工作中可以快速的完成壓縮和解壓縮的動作哦
官網下載地址: http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
1. 在項目中添加對ICSharpCode.SharpZipLib.dll的引用;
2. 在需要使用到ICSharpCode.SharpZipLib中定義的類的編碼界面中將其導入(Imports)
1 using ICSharpCode.SharpZipLib.Zip; 2 using System; 3 using System.IO; 4 5 namespace ZTO.WayBill.Utilities 6 { 7 /// <summary> 8 /// 壓縮類 9 /// http://www.cnblogs.com/kissdodog/p/3525295.html 10 11 /// </summary> 12 public class ZipHelper 13 { 14 /// <summary> 15 /// 壓縮文件夾 16 /// </summary> 17 /// <param name="source">源目錄</param> 18 /// <param name="s">ZipOutputStream對象</param> 19 public static void Compress(string source, ZipOutputStream s) 20 { 21 string[] filenames = Directory.GetFileSystemEntries(source); 22 foreach (string file in filenames) 23 { 24 if (Directory.Exists(file)) 25 { 26 // 遞歸壓縮子文件夾 27 Compress(file, s); 28 } 29 else 30 { 31 using (FileStream fs = File.OpenRead(file)) 32 { 33 byte[] buffer = new byte[4 * 1024]; 34 // 此處去掉盤符,如D:\123\1.txt 去掉D: 35 ZipEntry entry = new ZipEntry(file.Replace(Path.GetPathRoot(file), "")); 36 entry.DateTime = DateTime.Now; 37 s.PutNextEntry(entry); 38 int sourceBytes; 39 do 40 { 41 sourceBytes = fs.Read(buffer, 0, buffer.Length); 42 s.Write(buffer, 0, sourceBytes); 43 } while (sourceBytes > 0); 44 } 45 } 46 } 47 } 48 49 /// <summary> 50 /// 解壓縮 51 /// </summary> 52 /// <param name="sourceFile">壓縮包完整路徑地址</param> 53 /// <param name="targetPath">解壓路徑是哪裡</param> 54 /// <returns></returns> 55 public static bool Decompress(string sourceFile, string targetPath) 56 { 57 if (!File.Exists(sourceFile)) 58 { 59 throw new FileNotFoundException(string.Format("未能找到文件 '{0}' ", sourceFile)); 60 } 61 if (!Directory.Exists(targetPath)) 62 { 63 Directory.CreateDirectory(targetPath); 64 } 65 using (var s = new ZipInputStream(File.OpenRead(sourceFile))) 66 { 67 ZipEntry theEntry; 68 while ((theEntry = s.GetNextEntry()) != null) 69 { 70 if (theEntry.IsDirectory) 71 { 72 continue; 73 } 74 string directorName = Path.Combine(targetPath, Path.GetDirectoryName(theEntry.Name)); 75 string fileName = Path.Combine(directorName, Path.GetFileName(theEntry.Name)); 76 if (!Directory.Exists(directorName)) 77 { 78 Directory.CreateDirectory(directorName); 79 } 80 if (!String.IsNullOrEmpty(fileName)) 81 { 82 using (FileStream streamWriter = File.Create(fileName)) 83 { 84 int size = 4096; 85 byte[] data = new byte[size]; 86 while (size > 0) 87 { 88 streamWriter.Write(data, 0, size); 89 size = s.Read(data, 0, data.Length); 90 } 91 } 92 } 93 } 94 } 95 return true; 96 } 97 } 98 }