本文檔使用WinRAR方式來進行簡單的壓縮和解壓動做,純乾貨,實際項目這種壓縮方式用的少一點,通常我會使用第三方的壓縮dll來實現,就如同我上一個壓縮類博客,壓縮的是zip文件http://www.cnblogs.com/wohexiaocai/p/5469253.html,實際項目中也會用到rar壓縮,因此總結了一下代碼,以後簡單的幾個函數。html
歡迎傳播分享,必須保持原做者的信息,但禁止將該文檔直接用於商業盈利。編程
本人自從幾年前走上編程之路,一直致力於收集和總結出好用的框架和通用類庫,無論是微軟本身的仍是第三方的只要實際項目中好用且能夠解決實際問題那都會收集好,編寫好文章和別人一塊兒分享,這樣本身學到了,別人也能學到知識,當今社會很須要知識的搬運工。瀏覽器
Email:707055073@qq.com
服務器
本文章地址:http://www.cnblogs.com/wohexiaocai/p/5475506.htmlapp
通常BS的項目咱們都有一個功能叫作【下載excel】,或者【下載word】,下載excel通常都是根據查詢條件查詢獲得明細數據,生成excel,通過壓縮返回文件流響應瀏覽器進行下載動做,因此這個小功能就須要用到壓縮和生成excel的兩個知識點,今天我分享一下rar壓縮在實際項目的用途。框架
rar壓縮文件須要在服務器安裝程序,可是通常服務器都會使用他來做爲壓縮工具的,我在阿里雲的ECS也是默認就用的這個,服務器安裝一下就能夠了ide
rar的優勢函數
這裏獲取到WinRAR的安裝路徑,最好的辦法就是讀取註冊表,從註冊表獲取到他的安裝全路徑工具
64位系統WinRAR註冊表路徑是:SOFTWARE\Wow6432Node\WinRAR測試
32位系統WinRAR註冊表路徑是:SOFTWARE\WinRAR
他們都在註冊表的【HKEY_LOCAL_MACHINE】節點下面,因此你須要打開註冊表命令(regedit),來檢查服務器WinRAR有沒有安裝。
上面第一步完成了,須要就能夠開始壓縮了,這裏腦部一下須要經過命令的模式來調用WinRAR,rar命令說明文檔下載:http://files.cnblogs.com/files/wohexiaocai/WinRAR.zip
WinRAR a Info.rar "c:\latest data"
WinRAR x Info.rar d:\data\
/// <summary> /// 解壓到某個文件夾中 /// </summary> /// <param name="rarFilePath">rar文件全路徑</param> /// <param name="unRarPath">解壓到哪一個文件夾</param> /// <param name="password">解壓密碼</param> /// <param name="isOverride">是否覆蓋</param> public void UnRar(string rarFilePath, string unRarPath, string password = null, bool isOverride = false)
註釋也寫得很詳細的,因此使用的時候不再用擔憂這個方法的參數應該怎麼傳值,我用過不少第三方的dll,調用的時候好費勁傳參數,不知道到底應該傳什麼,一點都不方便,因此我寫代碼通常都喜歡用源碼進行調試,不喜歡引用dll,源碼我能夠調試出bug。
因爲這個幫助類不是靜態的,因此須要實例化
// 實例化就已經獲得系統WinRAR的安裝路徑了 WinRarHelper rarHelper = new WinRarHelper(); // 這裏能夠指定rar實際的安裝路徑 // rarHelper.WinRarPath = ""; // 壓縮 rarHelper.Rar(@"C:\Users\yhl\Desktop\單號圖片", @"C:\Users\yhl\Desktop\單號圖片.rar"); // 解壓 rarHelper.UnRar(@"C:\Users\yhl\Desktop\單號圖片.rar", @"C:\Users\yhl\Desktop\單號圖片");
下面仍是調用經常使用的方法,就能夠了。
1 //------------------------------------------------------------------------------------- 2 // All Rights Reserved , Copyright (C) 2016 , ZTO , Ltd . 3 //------------------------------------------------------------------------------------- 4 5 using System; 6 using System.Diagnostics; 7 using System.IO; 8 using Microsoft.Win32; 9 10 namespace ZTO.TestDb 11 { 12 /// <summary> 13 /// WinRAR壓縮操做幫助類 14 /// 15 /// 修改紀錄 16 /// 17 /// 2016-5-9 版本:1.0 YangHengLian 建立主鍵,注意命名空間的排序,測試很是好。 18 /// 2016-5-13 加上了自動獲取WinRAR安裝路徑的函數,無論是64位仍是32位系統, 19 /// 20 /// 版本:1.0 21 /// 22 /// <author> 23 /// <name>YangHengLian</name> 24 /// <date>2016-5-9</date> 25 /// </author> 26 /// </summary> 27 public class WinRarHelper 28 { 29 #region 屬性 30 private string _winRarPath; 31 32 /// <summary> 33 /// WinRAR安裝路徑,能夠本身設置,默認讀取系統註冊表 34 /// </summary> 35 public string WinRarPath 36 { 37 get 38 { 39 return string.IsNullOrEmpty(_winRarPath) ? GetWinRarInstallPath() : _winRarPath; 40 } 41 set 42 { 43 _winRarPath = value; 44 } 45 } 46 #endregion 47 48 /// <summary> 49 /// 解壓到某個文件夾中 50 /// </summary> 51 /// <param name="rarFilePath">rar文件全路徑</param> 52 /// <param name="unRarPath">解壓到哪一個文件夾</param> 53 /// <param name="password">解壓密碼</param> 54 /// <param name="isOverride">是否覆蓋</param> 55 public void UnRar(string rarFilePath, string unRarPath, string password = null, bool isOverride = false) 56 { 57 if (IsSetUpWinRar()) 58 { 59 throw new ArgumentNullException("WinRAR未安裝"); 60 } 61 RunCmd(string.Format("x{0} -o{1} {2} {3}", (password == null ? "" : " -p" + password), (isOverride ? "+" : "-"), rarFilePath, unRarPath)); 62 } 63 64 /// <summary> 65 /// 壓縮文件或者文件夾爲壓縮包 66 /// </summary> 67 /// <param name="filePath">須要壓縮的文件/文件夾全路徑</param> 68 /// <param name="saveFilePath">壓縮文件保存全路徑</param> 69 /// <param name="isOverride">是否覆蓋</param> 70 /// <param name="password">壓縮文件密碼</param> 71 public void Rar(string filePath, string saveFilePath, bool isOverride = false, string password = null) 72 { 73 if (IsSetUpWinRar()) 74 { 75 throw new ArgumentNullException("WinRAR未安裝"); 76 } 77 RunCmd(string.Format("a{0} -o{1} -ep2 -r {2} {3}", (password == null ? "" : " -p" + password), (isOverride ? "+" : "-"), saveFilePath, filePath)); 78 } 79 80 /// <summary> 81 /// 解壓是否安裝了WinRAR程序 82 /// </summary> 83 /// <returns></returns> 84 public bool IsSetUpWinRar() 85 { 86 if (!string.IsNullOrEmpty(WinRarPath)) 87 { 88 return File.Exists(WinRarPath); 89 } 90 var inistallPath = GetWinRarInstallPath(); 91 if (string.IsNullOrEmpty(inistallPath)) 92 { 93 return false; 94 } 95 WinRarPath = inistallPath; 96 return true; 97 } 98 99 /// <summary> 100 /// 從註冊表中獲取WinRAR的安裝路徑 101 /// </summary> 102 /// <returns></returns> 103 public string GetWinRarInstallPath() 104 { 105 var openKey = @"SOFTWARE\Wow6432Node\WinRAR";//64位註冊表 106 if (IntPtr.Size == 4) 107 { 108 openKey = @"SOFTWARE\WinRAR";//32位註冊表路徑 109 } 110 RegistryKey appPath = Registry.LocalMachine.OpenSubKey(openKey); 111 if (appPath != null) 112 { 113 // WinRAR安裝具體路徑 114 string path = appPath.GetValue("exe32").ToString(); 115 if (File.Exists(path)) 116 { 117 return path; 118 } 119 } 120 return null; 121 } 122 123 /// <summary> 124 /// 執行rar內部命令 125 /// </summary> 126 /// <param name="cmd">要執行的命令</param> 127 public void RunCmd(string cmd) 128 { 129 using (var p = new Process()) 130 { 131 p.StartInfo.FileName = WinRarPath; 132 p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 133 p.StartInfo.Arguments = cmd; 134 p.Start(); 135 p.WaitForExit(); 136 } 137 } 138 } 139 }