1. 程式人生 > >使用微軟自帶解壓類壓縮資料夾

使用微軟自帶解壓類壓縮資料夾

前言

因為即時通訊專案中,需要同步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

尾聲

解壓壓縮的方法還有很多,但既然可以使用微軟自帶的方法,何樂而不為呢。