先来简单说说压缩文件的好处,既然要用到那还是知道点好。
1、节约硬盘资源,方便管理
下面的代码所执行的压缩是存储压缩,
对于文件的大小控制的不是那么严格,
但是对于节约硬盘资源的原理是从磁盘的扇区角度上来说的。
2、便于传输
大家都知道用QQ或其他工具传输资源时,
压缩文件明显要快些。
由于文件太散程序也比较累。
其原理也是因为磁盘寻道要话时间
(这里提醒下广大市民如果有时间还是整理下磁盘碎片吧。)
上面都是废话,这里才是正题。
/// <summary>
/// 验证WinRar是否安装。
/// </summary>
/// <returns>true:已安装,false:未安装</returns>
private static bool ExistsRar(out String winRarPath)
{
winRarPath = String.Empty;
//通过Regedit(注册表)找到WinRar文件
var path = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";
var registryKey = Registry.LocalMachine.OpenSubKey(path);
if (registryKey == null) return false;//未安装
//registryKey = theReg;可以直接返回Registry对象供会面操作
winRarPath = registryKey.GetValue("").ToString();//这里为节约资源,直接返回路径,反正下面也没用到
registryKey.Close();//关闭注册表
return !String.IsNullOrEmpty(winRarPath);
}
该方法不要用于判断用户是否安装WinRar,
以判断是否继续执行一下代码
/// <summary>
/// 生成Zip
/// </summary>
/// <param name="path">文件夹路径</param>
/// <param name="rarPath">生成压缩文件的路径</param>
/// <param name="rarName">生成压缩文件的文件名</param>
public static void CompressRar(String path, String rarPath, String rarName)
{
try
{
String winRarPath = null;
if (!ExistsRar(out winRarPath)) return;//验证WinRar是否安装。
var pathInfo = String.Format("a -afzip -m0 -ep1 \"{0}\" \"{1}\"", rarName, path);
#region WinRar 用到的命令注释
//[a] 添加到压缩文件
//afzip 执行zip压缩方式,方便用户在不同环境下使用。(取消该参数则执行rar压缩)
//-m0 存储 添加到压缩文件时不压缩文件。共6个级别【0-5】,值越大效果越好,也越慢
//ep1 依名称排除主目录(生成的压缩文件不会出现不必要的层级)
//r 修复压缩档案
//t 测试压缩档案内的文件
//as 同步压缩档案内容
//-p 给压缩文件加密码方式为:-p123456
#endregion
//打包文件存放目录
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = winRarPath,//执行的文件名
Arguments = pathInfo,//需要执行的命令
UseShellExecute = false,//使用Shell执行
WindowStyle = ProcessWindowStyle.Hidden,//隐藏窗体
WorkingDirectory = rarPath,//rar 存放位置
CreateNoWindow = false,//不显示窗体
},
};
process.Start();//开始执行
process.WaitForExit();//等待完成并退出
process.Close();//关闭调用 cmd 的什么什么
}
catch (Exception ex)
{
throw ex;
}
}
配合上面方法成功完成zip压缩。
本来还想加是上一个添加注释的功能,
但是在网上找到的都是通过文件添加注释,这种方式不是我想要的。
由于时间关系暂时放下了。
下面再贴一个解压的方法,由于现在还没有用到解压的功能,
所以以下方法还未经测试。
/// <summary>
/// 解压
/// </summary>
/// <param name="unRarPath">文件夹路径</param>
/// <param name="rarPath">压缩文件的路径</param>
/// <param name="rarName">压缩文件的文件名</param>
/// <returns></returns>
public static String UnCompressRar(String unRarPath, String rarPath, String rarName)
{
try
{
String winRarPath = null;
if (!ExistsRar(out winRarPath)) return "";//验证WinRar是否安装。
if (Directory.Exists(unRarPath) == false)
{
Directory.CreateDirectory(unRarPath);
}
var pathInfo = "x " + rarName + " " + unRarPath + " -y";
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = winRarPath,//执行的文件名
Arguments = pathInfo,//需要执行的命令
UseShellExecute = false,//使用Shell执行
WindowStyle = ProcessWindowStyle.Hidden,//隐藏窗体
WorkingDirectory = rarPath,//rar 存放位置
CreateNoWindow = false,//不显示窗体
},
};
process.Start();//开始执行
process.WaitForExit();//等待完成并退出
process.Close();//关闭调用 cmd 的什么什么
}
catch (Exception ex)
{
throw ex;
}
return unRarPath;
}
最后补充点,如果安装了WinRAR而又不能调用成功,
试试将安装目录下的:Rar.exe 文件复制到 System32 下。
以上代码都是通过网上的资源整合而来,并非原创