使用微軟自帶解壓類壓縮資料夾
前言
因為即時通訊專案中,需要同步OA中的使用者頭像,使用者頭像是通過資料夾儲存的,資料夾內結構比較複雜。在即時通訊中需要先將OA伺服器上儲存的使用者頭像資料夾下載下來,因為直接下載資料夾方法很難,所以需要先將資料夾壓縮一下,然後在直接下載壓縮檔案。
他人雅慧
在網上找了不少了例子,幾乎都是使用SharpZipLib開源庫的方式,大體看了一下,感覺比較複雜,後在某篇教程的評論中發現更好的方式,於.net framework 4.5框架以後,可以直接使用微軟官方的ZipFile類就可,實踐後發現真的好用,什麼都不需要管,直接呼叫方法就行,果然還是微軟爸爸比較強大。(不需要考慮遞迴資料夾)
使用方法
準備新增dll:右鍵專案新增程式集 System.IO.Compression.dll,System.IO.Compression.FileSystem.dll
壓縮ZipFile.CreateFromDirectory(@"F:\APS.DataInterface\bin\Debug", AppDomain.CurrentDomain.BaseDirectory+"newdebug.zip");解釋一下兩個引數,第一個引數是要 壓縮的檔案(資料夾),第二個引數是儲存壓縮內容的檔案。
解壓ZipFile.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory+"newdebug.zip", @"F:\APS.DataInterface\bin\Debug");
解釋一下兩個引數,第一個引數是要 解壓的zip檔案,第二個引數是儲存解壓內容的路徑。
其他的一些操作提取單個檔案
using (ZipArchive zipArchive = ZipFile.Open(AppDomain.CurrentDomain.BaseDirectory + "newdebug.zip", ZipArchiveMode.Read)) { foreach (ZipArchiveEntry entry in zipArchive.Entries) { if (entry.Name == "APS.EP.Controls.dll") { using (Stream stream = entry.Open()) { if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "oneone")) { Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "oneone"); } entry.ExtractToFile(AppDomain.CurrentDomain.BaseDirectory + "oneone\\APS.EP.Controls.dll", true); } } } }
壓縮指定檔案型別檔案IEnumerable<string> files = [email protected]"F:\APS.DataInterface\bin\Debug", "*.dll");using (ZipArchive zipArchive = ZipFile.Open(AppDomain.CurrentDomain.BaseDirectory+"newdebug.zip", ZipArchiveMode.Create)){ foreach (string file in files) { var entryName = Path.Combine("DLL", Path.GetFileName(file)); zipArchive.CreateEntryFromFile(file, entryName); }}
當然還有其他的一些方法,暫時用不到,不多做研究。
專案實戰中的簡單通用類
1 /// <summary> 2 /// 壓縮、解壓幫助類 3 /// </summary> 4 public class ZipHelper 5 { 6 #region 單例模式 7 private volatile static ZipHelper _instance = null; 8 private static readonly object lockHelper = new object();//執行緒鎖 9 public static ZipHelper Instance 10 { 11 get 12 { 13 if (_instance == null) 14 { 15 lock (lockHelper) 16 { 17 if (_instance == null) 18 { 19 _instance = new ZipHelper(); 20 } 21 } 22 } 23 return _instance; 24 } 25 } 26 #endregion 單例模式 27 28 #region 建構函式 29 public ZipHelper() 30 { 31 32 } 33 #endregion 建構函式 34 35 #region 方法 36 /// <summary> 37 /// 簡單壓縮方法 38 /// </summary> 39 /// <param name="filepath">壓縮內容路徑</param> 40 /// <param name="zippath">壓縮後文件儲存路徑</param> 41 /// <returns></returns> 42 public bool Compress(string filepath,string zippath) 43 { 44 try 45 { 46 if (!Directory.Exists(filepath)) return false; 47 CreateDirectory(zippath); 48 ZipFile.CreateFromDirectory(filepath, zippath); 49 } 50 catch (Exception ex) 51 { 52 string errormes =LogHelper.ToMessage(ex); 53 string path = string.Empty; 54 path += AppDomain.CurrentDomain.BaseDirectory; 55 path += @"log\ZipErrorLog\Zip"; 56 path += DateTime.Now.ToString("yyyyMMddHHmm"); 57 path += ".txt"; 58 LogHelper.Instance.WriteLog(path, errormes); 59 return false; 60 } 61 return true; 62 } 63 /// <summary> 64 /// 簡單解壓方法 65 /// </summary> 66 /// <param name="zippath">壓縮檔案所在路徑</param> 67 /// <param name="savepath">解壓後儲存路徑</param> 68 /// <returns></returns> 69 public bool DeCompress(string zippath,string savepath) 70 { 71 try 72 { 73 if (!Directory.Exists(zippath)) return false; 74 ZipFile.ExtractToDirectory(zippath, savepath); 75 } 76 catch (Exception ex) 77 { 78 string errormes = LogHelper.ToMessage(ex); 79 string path = string.Empty; 80 path += AppDomain.CurrentDomain.BaseDirectory; 81 path += @"log\ZipErrorLog\DEZip"; 82 path += DateTime.Now.ToString("yyyyMMddHHmm"); 83 path += ".txt"; 84 LogHelper.Instance.WriteLog(path, errormes); 85 return false; 86 } 87 return true; 88 } 89 90 /// <summary> 91 /// 指定目錄下壓縮指定型別檔案 92 /// </summary> 93 /// <param name="filepath">指定目錄</param> 94 /// <param name="zippath">壓縮後儲存路徑</param> 95 /// <param name="folderName">壓縮檔案內部資料夾名</param> 96 /// <param name="fileType">指定型別 格式如:*.dll</param> 97 /// <returns></returns> 98 public bool Compress(string filepath, string zippath,string folderName,string fileType) 99 { 100 try 101 { 102 IEnumerable<string> files = 103 Directory.EnumerateFiles(filepath, fileType); 104 using (ZipArchive zipArchive = 105 ZipFile.Open(zippath, ZipArchiveMode.Create)) 106 { 107 foreach (string file in files) 108 { 109 var entryName = System.IO.Path.Combine(folderName, System.IO.Path.GetFileName(file)); 110 zipArchive.CreateEntryFromFile(file, entryName); 111 } 112 } 113 } 114 catch (Exception ex) 115 { 116 string errormes = LogHelper.ToMessage(ex); 117 string path = string.Empty; 118 path += AppDomain.CurrentDomain.BaseDirectory; 119 path += @"log\ZipErrorLog\Zip1"; 120 path += DateTime.Now.ToString("yyyyMMddHHmm"); 121 path += ".txt"; 122 LogHelper.Instance.WriteLog(path, errormes); 123 return false; 124 } 125 return true; 126 } 127 128 #region 呼叫方法 129 /// <summary> 130 /// 建立父級路徑 131 /// </summary> 132 /// <param name="infoPath"></param> 133 private void CreateDirectory(string infoPath) 134 { 135 DirectoryInfo directoryInfo = Directory.GetParent(infoPath); 136 if (!directoryInfo.Exists) 137 { 138 directoryInfo.Create(); 139 } 140 } 141 142 #endregion 143 #endregion 方法 144 }View Code
尾聲
解壓壓縮的方法還有很多,但既然可以使用微軟自帶的方法,何樂而不為呢。