2010-11-06 17 views
16

Bir WAV dosyasını MP3'e kodlamak için bir İşlem (lame.exe) gerçekleştireceğim.İşlemler sırasında STDOUT ve STDERR hatlarının, oluştukları sırada, satırda nasıl yakalanacağı. (C#)

İşlem bilgisini görüntülemek için işlemin STDOUT ve STDERR işlemlerini yapmak istiyorum.

İplik kullanmalı mıyım? Kafamı alamıyorum.

Bazı basit örnek kodlar takdir edilecektir. Bunları işleyebiliriz böylece

Teşekkür

+0

ben [buradan] numunesi bulduk (http://msdn.microsoft.com/en-us/library/system. diagnostics.process% 28v = vs80% 29.aspx), hem stdout hem de stderr öğelerinin nasıl yardımcı olacağını gösterir. Ayrıca bkz. Http://cleancode.sourceforge.net/api/csharp/html/T_CleanCode_IO_ExecProcess.htm. –

cevap

7

Process sınıfının aracılığı çalışan varsa, akarsuları yönlendirebilirsiniz. Stdout veya stderr'den senkronize veya senkronize olmayan şekilde okuyabilirsiniz. Yönlendirmeyi etkinleştirmek için, yönlendirmek istediğiniz akışlar için uygun yönlendirme özelliklerini true olarak ayarlayın ve UseShellExecute değerini false olarak ayarlayın. Daha sonra süreci başlatabilir ve akışlardan okuyabilirsiniz. Ayrıca, giriş yönlendirmeli stdin'i de besleyebilirsiniz.

süreç eşzamanlı

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

Bu, STDERR'i yakalamaz. –

+0

@Albin: Açıkçası, bunun için örnek yazmamıştım. –

1

basitleştirilmiş bir versiyonudur:

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

Sonsuz bir bekleyiş şansını önlemek için her zaman bir mola ile 'waitForExit' çağırın. waitForExit (10000) '=> 10 saniye bekler. –

İlgili konular