本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件http://www.cnblogs.com/wohexiaocai/p/5469253.html,实际项目中也会用到rar压缩,所以总结了一下代码,之后简单的几个函数。
欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利。
本人自从几年前走上编程之路,一直致力于收集和总结出好用的框架和通用类库,不管是微软自己的还是第三方的只要实际项目中好用且可以解决实际问题那都会收集好,编写好文章和别人一起分享,这样自己学到了,别人也能学到知识,当今社会很需要知识的搬运工。
Email:707055073@qq.com
本文章地址:http://www.cnblogs.com/wohexiaocai/p/5475506.html
1.基本介绍
一般BS的项目我们都有一个功能叫做【下载excel】,或者【下载word】,下载excel一般都是根据查询条件查询得到明细数据,生成excel,经过压缩返回文件流响应浏览器进行下载动作,所以这个小功能就需要用到压缩和生成excel的两个知识点,今天我分享一下rar压缩在实际项目的用途。
rar压缩文件需要在服务器安装程序,但是一般服务器都会使用他来作为压缩工具的,我在阿里云的ECS也是默认就用的这个,服务器安装一下就可以了
rar的优点
- 安装包非常好
- 提供很好的技术文档
- 通过命令的方式进行压缩,编写程序较为简单
- 使用普遍
2.实际项目
- 检查电脑是否安装了WinRAR
- 文件或者文件夹压缩
- 文件解压到文件夹中
- 等等
2.1 检查电脑有没有安装WinRAR
这里获取到WinRAR的安装路径,最好的办法就是读取注册表,从注册表获取到他的安装全路径
64位系统WinRAR注册表路径是:SOFTWAREWow6432NodeWinRAR
32位系统WinRAR注册表路径是:SOFTWAREWinRAR
他们都在注册表的【HKEY_LOCAL_MACHINE】节点下面,所以你需要打开注册表命令(regedit),来检查服务器WinRAR有没有安装。
2.2 压缩文件/文件夹
上面第一步完成了,需要就可以开始压缩了,这里脑部一下需要通过命令的模式来调用WinRAR,rar命令说明文档下载:http://files.cnblogs.com/files/wohexiaocai/WinRAR.zip
例子命令
- 添加文件夹 "c:latest data" 到压缩文件 Info.rar 中
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:UsersyhlDesktop单号图片", @"C:UsersyhlDesktop单号图片.rar"); // 解压 rarHelper.UnRar(@"C:UsersyhlDesktop单号图片.rar", @"C:UsersyhlDesktop单号图片");
下面还是调用常用的方法,就可以了。
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 = @"SOFTWAREWow6432NodeWinRAR";//64位注册表 106 if (IntPtr.Size == 4) 107 { 108 openKey = @"SOFTWAREWinRAR";//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 }