2010-11-06 4 views
16

Ich werde einen Prozess (lame.exe) ausführen, um eine WAV-Datei in MP3 zu kodieren.So erfassen Sie eine Prozess-STDOUT und STDERR Zeile für Zeile während des Prozessvorgangs. (C#)

Ich möchte die STDOUT und STDERR des Prozesses verarbeiten, um Fortschrittsinformationen anzuzeigen.

Muss ich Threading verwenden? Ich kann mich nicht darum kümmern.

Einige einfache Beispielcode würden geschätzt.

Dank

+0

ich die Probe gefunden [hier] (http://msdn.microsoft.com/en-us/library/system. diagnostics.process% 28v = vs.80% 29.aspx), das zeigt, wie stdout und stderr mit Hilfe von Threads gelesen werden können. Siehe auch http://cleancode.sourceforge.net/api/csharp/html/T_CleanCode_IO_ExecProcess.htm. –

Antwort

7

Wenn über die Process Klasse ausgeführt wird, können Sie die Streams umleiten, damit Sie sie verarbeiten kann. Sie können von stdout oder stderr synchron oder asynchron lesen. Um die Weiterleitung zu aktivieren, legen Sie die entsprechenden Umleitungseigenschaften für die umzuleitenden Streams auf true fest (z. B. RedirectStandardOutput) und setzen Sie UseShellExecute auf false. Dann können Sie einfach den Prozess starten und aus den Streams lesen. Sie können auch Input-Rediring-Standard eingeben.

zum Beispiel Prozess- und Druck, was auch immer der Prozess synchron

var proc = new Process() 
{ 
    StartInfo = new ProcessStartInfo(@"SomeProcess.exe") 
    { 
     RedirectStandardOutput = true, 
     UseShellExecute = false, 
    } 
}; 
if (!proc.Start()) 
{ 
    // handle error 
} 
var stdout = proc.StandardOutput; 
string line; 
while ((line = stdout.ReadLine()) != null) 
{ 
    // process and print 
    Process(line); 
    Console.WriteLine(line); 
} 
+11

Dies nimmt STDERR nicht auf. –

+0

@Albin: Nun, offensichtlich habe ich nicht das Beispiel dafür geschrieben. –

1

ist es an MSDN example dies für ... Hier ist eine vereinfachte Version:

var StdOut = ""; 
var StdErr = ""; 

var stdout = new StringBuilder(); 
var stderr = new StringBuilder(); 

var psi = new ProcessStartInfo(); 
psi.FileName = @"something.exe"; 
psi.CreateNoWindow = true; 
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardError = true; 

var proc = new Process(); 
proc.StartInfo = psi; 
proc.OutputDataReceived += (sender, e) => { stdout.AppendLine(e.Data); }; 
proc.ErrorDataReceived += (sender, e) => { stderr.AppendLine(e.Data); }; 
proc.Start(); 
proc.BeginOutputReadLine(); 
proc.BeginErrorReadLine(); 
proc.WaitForExit(10000); // per sachin-joseph's comment 

StdOut = stdout.ToString(); 
StdErr = stderr.ToString(); 
+0

Rufen Sie 'waitForExit' immer mit einem Timeout auf, um die Möglichkeit einer unendlichen Wartezeit zu vermeiden. 'waitForExit (10000)' => wartet 10 Sekunden. –

Verwandte Themen