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. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )

    线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...

  2. 08-IOSCore - App Store、国际化/本地化

    App Store 1. 帐号身份 0. 有Xcode 写程序,在虚拟机上运行 1. 成为苹果使用者 appleid 验证邮箱 权限: 能下载应用程序 2. 成为苹果开发者 https://devel ...

  3. oralce 简单错误汇集。。。。。

    1.ora-12560 TNS:协议适配器错误 实例名被错误修改或者oracle 服务没有正常启动.

  4. C++里面的取整函数

    #include<math.h> double ceil(double x) //向上取整 double floor(double x) //向下取整 也能够用数据类型强制转换,那要看数据 ...

  5. 百度地图api基本用法

    首先 ,如果想调用百度地图api,你需要获取一个百度地图api的密钥. 申请密钥很简单,在百度地图api的首页就有相关链接,填写相关信息百度就会给你一个密钥了. 接下来,就是引入百度地图的api 关键 ...

  6. 双击GridView查看详情

    效果如下: protected void gvEquData_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowTy ...

  7. hdu1200(来来回回串起来)

    Problem Description Mo and Larry have devised a way of encrypting messages. They first decide secret ...

  8. 高焕堂《android从程序员到架构师之路》 YY讲坛直面大师学习架构设计

    <android从程序员到架构师之路>YY讲坛活动:  sundy携手高焕堂老师全程YY答疑 与大师一起,分享android技术 时间:7月21日下午2:00   报名联系QQ:22243 ...

  9. UVA 2039 Pets(网络流)

    Problem Description Are you interested in pets? There is a very famous pets shop in the center of th ...

  10. 六款常用的linux C/C++ IDE

    摘要: 一.AnjutaAnjuta是一个多语言的IDE,它最大的特色是灵活,同时打开多个文件,内嵌代码级的调试器(调用gdb),应用程序向导(Application wizards)可以方便的帮助你 ...