【C#公共幫助類】WinRarHelper幫助類,實現文件或文件夾壓縮和解壓,實戰干貨,
關於本文檔的說明
本文檔使用WinRAR方式來進行簡單的壓縮和解壓動作,純干貨,實際項目這種壓縮方式用的少一點,一般我會使用第三方的壓縮dll來實現,就如同我上一個壓縮類博客,壓縮的是zip文件http://www.cnblogs.com/wohexiaocai/p/5469253.html,實際項目中也會用到rar壓縮,所以總結了一下代碼,之後簡單的幾個函數。
歡迎傳播分享,必須保持原作者的信息,但禁止將該文檔直接用於商業盈利。
本人自從幾年前走上編程之路,一直致力於收集和總結出好用的框架和通用類庫,不管是微軟自己的還是第三方的只要實際項目中好用且可以解決實際問題那都會收集好,編寫好文章和別人一起分享,這樣自己學到了,別人也能學到知識,當今社會很需要知識的搬運工。
Email:[email protected]
本文章地址:http://www.cnblogs.com/wohexiaocai/p/5475506.html
1.基本介紹
一般BS的項目我們都有一個功能叫做【下載excel】,或者【下載word】,下載excel一般都是根據查詢條件查詢得到明細數據,生成excel,經過壓縮返回文件流響應浏覽器進行下載動作,所以這個小功能就需要用到壓縮和生成excel的兩個知識點,今天我分享一下rar壓縮在實際項目的用途。
rar壓縮文件需要在服務器安裝程序,但是一般服務器都會使用他來作為壓縮工具的,我在阿裡雲的ECS也是默認就用的這個,服務器安裝一下就可以了
rar的優點
2.實際項目
2.1 檢查電腦有沒有安裝WinRAR
這裡獲取到WinRAR的安裝路徑,最好的辦法就是讀取注冊表,從注冊表獲取到他的安裝全路徑
64位系統WinRAR注冊表路徑是:SOFTWARE\Wow6432Node\WinRAR
32位系統WinRAR注冊表路徑是:SOFTWARE\WinRAR
他們都在注冊表的【HKEY_LOCAL_MACHINE】節點下面,所以你需要打開注冊表命令(regedit),來檢查服務器WinRAR有沒有安裝。
2.2 壓縮文件/文件夾
上面第一步完成了,需要就可以開始壓縮了,這裡腦部一下需要通過命令的模式來調用WinRAR,rar命令說明文檔下載:http://files.cnblogs.com/files/wohexiaocai/WinRAR.zip
例子命令
WinRAR a Info.rar "c:\latest data"
- 解壓壓縮文件 Info.rar 到文件夾 d:\data
WinRAR x Info.rar d:\data\
2.3 解壓文件到指定的文件夾路徑
/// <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。
3.調用代碼參考
由於這個幫助類不是靜態的,所以需要實例化
// 實例化就已經得到系統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\單號圖片");
下面還是調用常用的方法,就可以了。
4.WinRarHelper下載
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 }
WinRarHelper