2010-11-06 69 views
16

我將執行一個Process(lame.exe)來將WAV文件編碼爲MP3。如何在流程操作期間逐行捕獲流程STDOUT和STDERR。 (C#)

我想處理進程的STDOUT和STDERR以顯示進度信息。

我需要使用線程嗎?我無法理解它。

一些簡單的示例代碼將不勝感激。

感謝

+0

我發現樣本[這裏](http://msdn.microsoft.com/en-us/library/system。 diagnostics.process%28v = vs80%29.aspx),它顯示瞭如何使用有幫助的線程讀取stdout和stderr。另請參閱http://cleancode.sourceforge.net/api/csharp/html/T_CleanCode_IO_ExecProcess.htm。 – 2012-03-08 18:44:55

回答

7

如果通過Process類運行,您可以重定向數據流,因此您可以處理它們。您可以同步或異步地從stdout或stderr讀取。要啓用重定向,請爲要重定向的流設置適當的重定向屬性爲true(例如,RedirectStandardOutput),並將UseShellExecute設置爲false。然後,您可以啓動該流程並從流中讀取數據。您也可以提供輸入重定向標準輸入。

例如,處理和打印任何進程寫入stdout同步

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

這不捕獲STDERR。 – 2010-11-06 06:27:46

+0

@Albin:很明顯,我沒有寫這個例子。 – 2010-11-06 06:41:19

1

an MSDN example這...這是一個簡化版本:

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

總是通過超時調用'waitForExit'來防止無限等待的機會。 'waitForExit(10000)'=>等待10秒鐘。 – 2017-09-04 08:46:39