Come estrarre un file rar in C #?

Voglio estrarre i file .rar usando la shell cmd così ho scritto questo codice:

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

La prima volta ha funzionato bene, la seconda volta non mostrava nulla.

Usa SevenZipSharp in quanto è un modo un po ‘migliore di fare le cose quindi lavorare con alcuni .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"; })); } 

Certo, devi aggiustare un po ‘le cose e usare alcune delle tue cose. Ma per il gusto di esempio ho aggiunto alcuni metodi aggiuntivi.

È ansible saltare il passaggio intermedio e chiamare il winrar.exe con i parametri diritti invece del primo cmd.exe di instanciazione

Puoi anche dare un’occhiata all’SDK 7-zip

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

Hai dimenticato di aggiungere un stream per leggere gli errori. Se WINRAR si comporta correttamente, troverai l’output dell’errore quando aggiungi lo stream per leggerlo.

Ho la risposta. prova questo:

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

Come suggerito da Kjartan, l’utilizzo dell’SDK di 7-Zip potrebbe rappresentare un’opzione migliore rispetto alla generazione di un eseguibile esterno a seconda dell’utilizzo:

7-Zip SDK è una libreria C / C ++ ma http://sevenzipsharp.codeplex.com/ ha una libreria .Net su di esso attorno all’SDK di 7-Zip che ne facilita l’uso in .NET.

Possiamo anche usare questo,

 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 risposte, solo sam mousavi sta rispondendo direttamente alla tua domanda, ma nessuno ti sta dicendo cosa c’è che non va. Citando dal manuale WinRAR:

… il comando: WinRAR x Fonts *.ttf NewFonts\
estrarrà i file * .ttf dai font di archivio nella cartella NewFonts
È necessario utilizzare la barra rovesciata finale come nell’esempio sopra per indicare la cartella di destinazione.

E questo è esattamente ciò che manca in c:\download . In questo momento tenta di estrarre il file c: \ download all’interno dell’archivio nella directory corrente. Come potrebbe funzionare la prima volta è un mistero.

Puoi usare questa libreria direttamente: http://sevenziplib.codeplex.com/

SevenZipLib è un’interfaccia gestita leggera e di facile utilizzo per la libreria 7-zip.