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的优点

  1. 安装包非常好
  2. 提供很好的技术文档
  3. 通过命令的方式进行压缩,编写程序较为简单
  4. 使用普遍

2.实际项目

  1. 检查电脑是否安装了WinRAR
  2. 文件或者文件夹压缩
  3. 文件解压到文件夹中
  4. 等等

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

   例子命令

  1. 添加文件夹 "c:\latest data" 到压缩文件 Info.rar 中

WinRAR a Info.rar "c:\latest data"

  1. 解压压缩文件 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 = nullbool 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下载

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 }
 
 
分类: C#公共类

WinRarHelper帮助类的更多相关文章

  1. 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货

    关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...

  2. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  3. WinRAR压缩操作帮助类

    //------------------------------------------------------------------------------------- // All Right ...

  4. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  5. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  6. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  7. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  8. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  9. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

随机推荐

  1. json datetime转换问题

    我用Newtonsoft.Json.dll转换成json,这次是把一个集合转换成json,这个集合里有个DateTime类型的数据,转换完成后会变成/Date(1286375605000+0800)/ ...

  2. Jquery学习笔记: attr和 prop的区别,以及为html标签自定义属性

    一.自定义html标签属性 对于html文件中的html标签,可以自定义属性,如: <a href="#" id="link1" action=" ...

  3. java BigDecimal的使用和四舍五入及格式规范(精准数据)

    • Java中的简单浮点数类型float和double不能够进行运算.不光是Java,在其它很多编程语言中也有这样的问题. 如果我们编译运行下面这个程序会看到什么? public   class  T ...

  4. perl 为什么要用引用来做对象呢?

    perl 为什么要用引用来做对象呢? 因为一个重要的原因是 my 引用 脱离作用域,外部仍旧生效

  5. 全面解读Python Web开发框架Django

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...

  6. 日积月累:ScrollView嵌套ListView只显示一行

    在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容.在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示.于是乎有了如下布局: & ...

  7. 【模式识别】Boosting

    Boosting简单介绍 分类中通常使用将多个弱分类器组合成强分类器进行分类的方法,统称为集成分类方法(Ensemble Method).比較简单的如在Boosting之前出现Bagging的方法,首 ...

  8. Swift - 产生不重复数字的随机数生成器

    在Swift中,可以使用函数类型的参数,也可以使用函数类型的返回值.而作为返回值的函数,还能“捕获”外部的值,并多次使用它.这个特性,常可用来创建各种生成器. 下面通过创建一个“随机数生成器函数”作为 ...

  9. POJ - 1422 Air Raid 二分图最大匹配

    题目大意:有n个点,m条单向线段.如今问要从几个点出发才干遍历到全部的点 解题思路:二分图最大匹配,仅仅要一条匹配,就表示两个点联通,两个点联通仅仅须要选取当中一个点就可以,所以有多少条匹配.就能够减 ...

  10. Good Bye 2013---B. New Year Present

    New Year Present time limit per test 1 second memory limit per test 256 megabytes input standard inp ...