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); } }