2010-11-06 49 views
16

Je vais exécuter un processus (lame.exe) pour encoder un fichier WAV en MP3.Comment capturer une ligne Traiter les lignes STDOUT et STDERR au fur et à mesure qu'elles se produisent, pendant le traitement. (C#)

Je souhaite traiter les STDOUT et STDERR du processus pour afficher les informations de progression.

Dois-je utiliser un filetage? Je ne peux pas comprendre.

Un exemple de code simple serait apprécié.

Merci

+0

J'ai trouvé l'échantillon [ici] (http://msdn.microsoft.com/en-us/library/system. diagnostics.process% 28v = vs.80% 29.aspx) qui montre comment lire à la fois stdout et stderr avec des threads utiles. Voir aussi http://cleancode.sourceforge.net/api/csharp/html/T_CleanCode_IO_ExecProcess.htm. –

Répondre

7

Si en cours d'exécution par la classe Process, vous pouvez rediriger les flux de sorte que vous pouvez les traiter. Vous pouvez lire stdout ou stderr de manière synchrone ou asynchrone. Pour activer la redirection, définissez les propriétés de redirection appropriées sur true pour les flux que vous souhaitez rediriger (par exemple, RedirectStandardOutput) et définissez UseShellExecute sur false. Ensuite, vous pouvez simplement démarrer le processus et lire les flux. Vous pouvez également charger l'entrée redirigeant stdin.

par exemple, le processus et l'impression quel que soit le processus écrit stdout synchrone

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

Cela ne capture pas STDERR. –

+0

@Albin: Bien évidemment, je n'ai pas écrit l'exemple pour le faire. –

1

Il est an MSDN example pour cette ... Voici une version simplifiée:

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

Toujours appeler 'waitForExit' avec un délai d'expiration pour éviter toute attente infinie. 'waitForExit (10000)' => attend 10 secondes. –