如何在C#中提取rar文件?

我想使用cmd shell提取.rar文件,所以我写了这段代码:

string commandLine = @"c:\progra~1\winrar\winrar ec:\download\TestedU.rar c:\download"; ProcessStartInfo PSI = new ProcessStartInfo("cmd.exe"); PSI.RedirectStandardInput = true; PSI.RedirectStandardOutput = true; PSI.RedirectStandardError = true; PSI.UseShellExecute = false; Process p = Process.Start(PSI); StreamWriter SW = p.StandardInput; StreamReader SR = p.StandardOutput; SW.WriteLine(commandLine); SW.Close(); 

它第一次工作正常,第二次没有显示任何东西。

使用SevenZipSharp,因为这是更好的方式,然后使用一些.exe的。

 private ReadOnlyCollection ExtractArchive(string varPathToFile, string varDestinationDirectory) { ReadOnlyCollection readOnlyArchiveFilenames; ReadOnlyCollection readOnlyVolumeFilenames; varExtractionFinished = false; varExtractionFailed = false; SevenZipExtractor.SetLibraryPath(sevenZipDll); string fileName = ""; string directory = ""; Invoke(new SetNoArgsDelegate(() => { fileName = varPathToFile; directory = varDestinationDirectory; })); using (SevenZipExtractor extr = new SevenZipExtractor(fileName)) { //string[] test = extr.ArchiveFileNames. readOnlyArchiveFilenames = extr.ArchiveFileNames; readOnlyVolumeFilenames = extr.VolumeFileNames; //foreach (string dinosaur in readOnlyDinosaurs) { //MessageBox.Show(dinosaur); // } //foreach (string dinosaur in readOnlyDinosaurs1) { // // MessageBox.Show(dinosaur); // } try { extr.Extracting += extr_Extracting; extr.FileExtractionStarted += extr_FileExtractionStarted; extr.FileExists += extr_FileExists; extr.ExtractionFinished += extr_ExtractionFinished; extr.ExtractArchive(directory); } catch (FileNotFoundException error) { if (varExtractionCancel) { LogBoxTextAdd("[EXTRACTION WAS CANCELED]"); } else { MessageBox.Show(error.ToString(), "Error with extraction"); varExtractionFailed = true; } } } varExtractionFinished = true; return readOnlyVolumeFilenames; } private void extr_FileExists(object sender, FileOverwriteEventArgs e) { listViewLogFile.Invoke(new SetOverwriteDelegate((args) => LogBoxTextAdd(String.Format("Warning: \"{0}\" already exists; overwritten\r\n", args.FileName))), e); } private void extr_FileExtractionStarted(object sender, FileInfoEventArgs e) { listViewLogFile.Invoke(new SetInfoDelegate((args) => LogBoxTextAdd(String.Format("Extracting \"{0}\"", args.FileInfo.FileName))), e); } private void extr_Extracting(object sender, ProgressEventArgs e) { progressBarCurrentExtract.Invoke(new SetProgressDelegate((args) => progressBarCurrentExtract.Increment(args.PercentDelta)), e); } private void extr_ExtractionFinished(object sender, EventArgs e) { Invoke(new SetNoArgsDelegate(() => { //pb_ExtractWork.Style = ProgressBarStyle.Blocks; progressBarCurrentExtract.Value = 0; varExtractionFinished = true; //l_ExtractProgress.Text = "Finished"; })); } 

当然你需要稍微调整一下,并使用你自己的东西。 但为了举例,我添加了一些额外的方法。

您可以跳过中间步骤并使用参数直接调用winrar.exe而不是首先实例化cmd.exe

您也可以查看7-zip SDK

 UnRar("C:\\Download\\sampleextractfolder\\", filepath2); private static void UnRar(string WorkingDirectory, string filepath) { // Microsoft.Win32 and System.Diagnostics namespaces are imported //Dim objRegKey As RegistryKey RegistryKey objRegKey; objRegKey = Registry.ClassesRoot.OpenSubKey("WinRAR\\Shell\\Open\\Command"); // Windows 7 Registry entry for WinRAR Open Command // Dim obj As Object = objRegKey.GetValue(""); Object obj = objRegKey.GetValue(""); //Dim objRarPath As String = obj.ToString() string objRarPath = obj.ToString(); objRarPath = objRarPath.Substring(1, objRarPath.Length - 7); objRegKey.Close(); //Dim objArguments As String string objArguments; // in the following format // " XG:\Downloads\samplefile.rar G:\Downloads\sampleextractfolder\" objArguments = " X " + " " + filepath + " " + " " + WorkingDirectory; // Dim objStartInfo As New ProcessStartInfo() ProcessStartInfo objStartInfo = new ProcessStartInfo(); // Set the UseShellExecute property of StartInfo object to FALSE //Otherwise the we can get the following error message //The Process object must have the UseShellExecute property set to false in order to use environment variables. objStartInfo.UseShellExecute = false; objStartInfo.FileName = objRarPath; objStartInfo.Arguments = objArguments; objStartInfo.WindowStyle = ProcessWindowStyle.Hidden; objStartInfo.WorkingDirectory = WorkingDirectory + "\\"; // Dim objProcess As New Process() Process objProcess = new Process(); objProcess.StartInfo = objStartInfo; objProcess.Start(); objProcess.WaitForExit(); try { FileInfo file = new FileInfo(filepath); file.Delete(); } catch (FileNotFoundException e) { throw e; } } 

您忘记添加流以读取错误。 如果WINRAR运行正常,则在添加流以读取它时,您将找到错误输出。

我有答案。 试试这个:

  System.Diagnostics.Process proc = new System.Diagnostics.Process(); //Put the path of installed winrar.exe proc.StartInfo.FileName = @"C:\Program Files\WinRAR\unrar.exe"; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; proc.EnableRaisingEvents = true; //PWD: Password if the file has any //SRC: The path of your rar file. eg: c:\temp\abc.rar //DES: The path you want it to be extracted. eg: d:\extracted //ATTENTION: DESTINATION FOLDER MUST EXIST! proc.StartInfo.Arguments = String.Format("x -p{0} {1} {2}", PWD, SRC, DES); proc.Start(); 

正如Kjartan所建议的,使用7-Zip SDK可能是比产生外部可执行文件更好的选择,具体取决于您的用途:

7-Zip SDK是一个C / C ++库,但http://sevenzipsharp.codeplex.com/有一个围绕7-Zip SDK的.Net库,这使它更容易在.NET中使用。

我们也可以用这个,

 string SourceFile = @"G:\SourceFolder\125.rar"; string DestinationPath = @"G:\Destination\"; System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = @"G:\Software\WinRAR.exe"; process.StartInfo.CreateNoWindow = true; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.EnableRaisingEvents = false; process.StartInfo.Arguments = string.Format("x -o+ \"{0}\" \"{1}\"", SourceFile, DestinationPath); process.Start(); 

9答案,只有sam mousavi直接回答你的问题,但没有人告诉你什么是错的。 引用WinRAR手册:

…命令: WinRAR x Fonts *.ttf NewFonts\
将* .ttf文件从存档字体中提取到文件夹NewFonts
您需要使用上面示例中的尾部反斜杠来表示目标文件夹。

这正是c:\download缺少的东西。 现在它尝试将存档中的文件c:\ download解压缩到当前目录。 如何在第一时间工作是一个谜。

您可以直接使用此lib: http : //sevenziplib.codeplex.com/

SevenZipLib是一个轻量级,易于使用的7-zip库管理界面。