WinRarHelper帮助类
WinRarHelper帮助类
关于本文档的说明
本文档使用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注册表路径是:SOFTWARE\Wow6432Node\WinRAR
32位系统WinRAR注册表路径是:SOFTWARE\WinRAR
他们都在注册表的【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 解压文件到指定的文件夹路径
1
2
3
4
5
6
7
8
|
/// <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帮助类的更多相关文章
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- WinRAR压缩操作帮助类
//------------------------------------------------------------------------------------- // All Right ...
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
随机推荐
- nginx提示:500 Internal Server Error错误的解决方法
现在越来越多的站点开始用 Nginx ,("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 ...
- zoj3713 7Bit
意思是把一行字符串的长度按照找7位一个字节输出,如果长度能够存在7位里,字节的最高位置0,否则只输出7位并且输出字节的最高位置1,直到全部输出长度. 要注意的是有空串要输出00,其他按照16进制输出就 ...
- 旧版本mysql下载大全,爽~~
http://mirror.cogentco.com/pub/mysql/MySQL-4.1/ http://mirror.cogentco.com/pub/mysql/MySQL-5.0/ http ...
- Android 去掉Activity的跳转动画
startActivity或finish的时候调用一句话即可: overridePendingTransition(0, 0);
- cocos2d-x游戏开发系列教程-坦克大战游戏之所有坦克之间的碰撞检测
上篇我们完成了简单的AI编写,但是各个坦克移动时之间是可以重合的, 这节课我们来完成坦克之间的碰撞检测,还是在上篇的EnemyAI中完成. 1.我先现在坦克类Tank中添加两个成员变量: CC_SYN ...
- 基于visual Studio2013解决C语言竞赛题之1003字母打印
题目 解决代码及点评 ///************************************************************************/ ...
- 在WINDOWS下 三步快速配置 eclipse c++ 环境
所需软件 1.Eclipse IDE for C/C++ Developers http://www.eclipse.org/downloads/packages/eclipse-ide-cc-dev ...
- Eclipse用法和技巧二十六:浅谈快捷键
网络上到处都是eclipse有哪些常用的快捷键,其中还有很多讲得着实不错,这里就不再狗尾续貂而是谈谈别的这段时间的一些思考.最近加入了开发团队,代码量突突的上去了,同时也发现关于快捷键还是有很多细节, ...
- MySQL推出Applier,可实时复制数据到Hadoop
MySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从).试想一下,如果从服务器不再局限为一个MySQL服务器,而是其他任何数据库服务器或平台,并且复制事件 ...
- 使用ssh远程执行命令批量导出数据库到本地(转)
前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,1 ...