Windows系统中C#调用WinRAR来压缩和解压缩文件的方法
过程说明都在注释里,我们直接来看代码:
压缩:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
usingICSharpCode.SharpZipLib.Zip;
usingSystem.Diagnostics;
publicclasswinrar
{
#region压缩文件
///<summary>
///压缩文件
///</summary>
///<paramname="filesPath">压缩文件及完整路径(D:\abc)</param>
///<paramname="zipFilePath">压缩包所存完整路径(D:\a.zip或d:\a.rar)</param>
publicstaticvoidCreateZipFile(stringfilesPath,stringzipFilePath)
{
if(!Directory.Exists(filesPath))
{
Console.WriteLine("Cannotfinddirectory'{0}'",filesPath);
return;
}
try
{
string[]filenames=Directory.GetFiles(filesPath);
using(ZipOutputStreams=newZipOutputStream(File.Create(zipFilePath)))
{
s.SetLevel(9);//压缩级别0-9
//s.Password="123";//Zip压缩文件密码
byte[]buffer=newbyte[4096];//缓冲区大小
foreach(stringfileinfilenames)
{
ZipEntryentry=newZipEntry(Path.GetFileName(file));
entry.DateTime=DateTime.Now;
s.PutNextEntry(entry);
using(FileStreamfs=File.OpenRead(file))
{
intsourceBytes;
do
{
sourceBytes=fs.Read(buffer,0,buffer.Length);
s.Write(buffer,0,sourceBytes);
}while(sourceBytes>0);
}
}
s.Finish();
s.Close();
}
}
catch(Exceptionex)
{
AutoCompare.ErrorLog.SaveError(ex,"压缩文件出错!");
}
}
#endregion
#region解压文件
///<summary>
///解压文件
///</summary>
///<paramname="zipFilePath">解压文件及完整路径(d:\a.zip或d:\a.rar)</param>
publicstaticvoidUnZipFile(stringzipFilePath)
{
if(!File.Exists(zipFilePath))
{
Console.WriteLine("Cannotfindfile'{0}'",zipFilePath);
return;
}
using(ZipInputStreams=newZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntrytheEntry;
while((theEntry=s.GetNextEntry())!=null)
{
Console.WriteLine(theEntry.Name);
stringdirectoryName=Path.GetDirectoryName(theEntry.Name);
stringfileName=Path.GetFileName(theEntry.Name);
//createdirectory
if(directoryName.Length>0)
{
Directory.CreateDirectory(directoryName);
}
if(fileName!=String.Empty)
{
using(FileStreamstreamWriter=File.Create(theEntry.Name))
{
intsize=2048;
byte[]data=newbyte[2048];
while(true)
{
size=s.Read(data,0,data.Length);
if(size>0)
{
streamWriter.Write(data,0,size);
}
else
{
break;
}
}
}
}
}
}
}
#endregion
stringrarFile=@"C:\ProgramFiles\WinRAR\WinRAR.exe";//winrar之所在的路径,这里找执行文件所在文件夹和"C:\ProgramFiles\WinRAR\WinRAR.exe
#regionRAR压缩文件(支持路径中含有空格)
///<summary>
///压缩到.rar
///</summary>
///<paramname="intputPath">输入目录</param>
///<paramname="outputPath">输出目录</param>
///<paramname="outputFileName">输出文件名</param>
publicstaticvoidCompressRar(stringintputPath,stringoutputPath,stringoutputFileName)
{
//rar执行时的命令、参数
stringrarCmd;
//启动进程的参数
ProcessStartInfoprocessStartInfo;
//进程对象
Processprocess;
//命令参数
rarCmd="a"+outputFileName+""+intputPath+"-r-ep1";
//rar路径
stringrarFile=System.Windows.Forms.Application.StartupPath+@"\rar.exe";
if(outputPath.IndexOf('')>0||intputPath.IndexOf('')>0)
{
rarCmd="a"+outputFileName+"\""+intputPath+"\"-r-ep1";
}
if(!File.Exists(System.Windows.Forms.Application.StartupPath+@"\rar.exe"))
{
rarFile=@"C:\ProgramFiles\WinRAR\WinRAR.exe";
}
try
{
//判断输入目录是否存在
if(!Directory.Exists(intputPath))
{
thrownewArgumentException("CompressRar'arge:inputPathisn'texsit.");
}
//创建启动进程的参数
processStartInfo=newProcessStartInfo();
//指定启动文件名
processStartInfo.FileName=@"C:\ProgramFiles\WinRAR\WinRAR.exe";
//指定启动该文件时的命令、参数
processStartInfo.Arguments=rarCmd;
//指定启动窗口模式:隐藏
processStartInfo.WindowStyle=ProcessWindowStyle.Hidden;
//指定压缩后到达路径
processStartInfo.WorkingDirectory=outputPath;
//创建进程对象
process=newProcess();
//指定进程对象启动信息对象
process.StartInfo=processStartInfo;
//启动进程
process.Start();
//指定进程自行退行为止
process.WaitForExit();
}
catch(Exceptionex)
{
throwex;
}
}
#endregion
#regionRAR解压文件(支持路径中含有空格)
///<summary>
///解压文件
///</summary>
///<paramname="outputPath">解压到的路径</param>
///<paramname="inputPath">压缩包所在路径(解压路径需存在)</param>
///<paramname="inputFileName">压缩包名</param>
///<returns></returns>
publicstaticvoidDecompressRar(stringoutputPath,stringinputPath,stringinputFileName)
{
//rar执行时的命令、参数
stringrarCmd;
//启动进程的参数
ProcessStartInfoprocessStartInfo;
//进程对象
Processprocess;
//rar路径
stringrarFile=System.Windows.Forms.Application.StartupPath+@"\rar.exe";
//命令参数
rarCmd="e"+inputFileName+""+outputPath+"-r-ep1";
if(outputPath.IndexOf('')>0||inputPath.IndexOf('')>0)
{
rarCmd="x-inul-y-o+-ep1\""+inputPath+"\\"+inputFileName+"\"\""+outputPath+"\"";
}
if(!File.Exists(System.Windows.Forms.Application.StartupPath+@"\rar.exe"))
{
rarFile=@"C:\ProgramFiles\WinRAR\WinRAR.exe";
}
try
{
//创建启动进程的参数
processStartInfo=newProcessStartInfo();
//指定启动文件名
processStartInfo.FileName=rarFile;
//指定启动该文件时的命令、参数
processStartInfo.Arguments=rarCmd;
//指定启动窗口模式:隐藏
processStartInfo.WindowStyle=ProcessWindowStyle.Hidden;
//指定解压后到达路径(文件夹需要存在)
processStartInfo.WorkingDirectory=inputPath;
//创建进程对象
process=newProcess();
//指定进程对象启动信息对象
process.StartInfo=processStartInfo;
//启动进程
process.Start();
//指定进程自行退行为止
process.WaitForExit();
//释放资源
process.Close();
}
catch(Exceptionex)
{
throwex;
}
}
#endregion
}
解压:
classUseWinRar
{
privatestringrarExeFile=null;//WinRar.exe路径
privatebooluseAble=false;//标志WinRar是否可用
publicUseWinRar()//构造方法
{
rarExeFile=getRarExe();
useAble=!string.IsNullOrEmpty(rarExeFile);//如果WinRar.exe路径不为空,说明可用
}
publicstaticstringgetRarExe()//获取WinRar所在磁盘路径
{
stringrarExe=null;
RegistryKeyregKey=Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\WinRAR.exe");
if(regKey==null)
{
returnnull;
}
rarExe=regKey.GetValue("").ToString();
regKey.Close();//关闭注册表
returnrarExe;
}
publicboolexeRarCmd(stringcmd)//执行某个命令
{
if(!useAble)
{
returnfalse;
}
Processprocess=newProcess();//新建一个过程
ProcessStartInfostartInfo=newProcessStartInfo(rarExeFile);//新建一个启动信息
startInfo.Arguments=cmd;//设置启动信息的执行参数
//startInfo.WorkingDirectory=workDirectory;//设置启动信息的工作目录
startInfo.WindowStyle=ProcessWindowStyle.Hidden;//设置程序后台运行
process.StartInfo=startInfo;//设置过程的启动信息
process.Start();//开始过程
returntrue;
}
publicboolunZipAll(stringzipFile,stringtargetDirectory)//将指定压缩文件解压到指定目录
{
if(!File.Exists(zipFile))
{
returnfalse;
}
stringzipCmd="x"+zipFile+""+targetDirectory+"-y-ibck";//后台解压压缩文件中全部文件到指定目录
exeRarCmd(zipCmd);//执行解压操作
returntrue;
}
publicboolunZipToCurrentDirectory(stringzipFile)//将压缩文件解压到当前目录
{
if(!File.Exists(zipFile))
{
returnfalse;
}
FileInfofileInfo=newFileInfo(zipFile);
returnunZipAll(zipFile,fileInfo.DirectoryName);
}
}
Main:
publicstaticvoidMain()
{
UseWinRarrar=newUseWinRar();
string[]zipFiles=Directory.GetFiles(Environment.CurrentDirectory,"*.zip");//获取所有zip文件路径
foreach(stringzipFileinzipFiles)
{
rar.unZipToCurrentDirectory(zipFile);
}
}