2010-12-13 96 views
3

我想啓動一個外部應用程序並捕獲它的輸出。 這很簡單,使用Diagnostics.Process及其OutputStream如何在C#/ .NET中捕獲二進制輸出輸出

然而,這個過程中我已經產生二進制數據,這是我需要捕捉的Stream,而不是文本StreamWriter

它有沒有辦法讓底層的原始二進制流?

目前,我通過啓動一個批處理文件,它看起來像本事:

myapplication | socat stdin tcp-connect:localhost:12345

而且在我的代碼創建並監聽TCP套接字。雖然這個黑客工作,它有點難看,我更喜歡直接使用外部過程。

(有一件事我不能做的是使用本地文件,因爲數據是在其本質上實時)

回答

1

你可以使用命名管道,類似但更深入的比Process的OutputStream功能(它基本上是StandardOutput的一個監聽器)。命名管道可以使用Streams進行訪問,而不用假定內容是Unicode字符數據。它們也不會限制網絡端口,除非您想要遠程連接到管道(這也是可能的)。

+1

但是,您需要修改子進程以使其使用管道,否則請調用'CreateProcess'將子管道作爲子標準輸出句柄傳遞。 – 2011-03-27 01:32:25

1

我用follwowing代碼從一個程序

ProcessStartInfo info = new ProcessStartInfo(); 
info.FileName = "yourProcess"; 
info.Arguments = "blah"; 
info.StandardOutputEncoding = System.Text.Encoding.GetEncoding("latin1");//important part 
info.RedirectStandardOutput = true; 
info.UseShellExecute = false; 
Process p = Process.Start(info); 
FileStream fs = new FileStream("outputfile.bin", FileMode.Create); 

while((val = p.StandardOutput.Read())!= -1){ 
    fs.WriteByte((byte)val); 
} 

p.WaitForExit(); 
fs.Close(); 
3

如何p.StandardOutput.BaseStream的標準輸出讀取二進制數據?

+0

如何給出完整答案? – SerG 2014-02-26 13:22:59

+1

@SerG:這是一個完整的答案。唯一的問題是「它有一種方法可以獲取底層原始二進制流?」 – 2014-02-26 16:05:11