如何在C#/ .NET中捕获二进制进程输出

时间:2010-12-13 18:56:51

标签: c# .net streaming

我想启动外部应用程序,并捕获其输出。 这很简单,使用 Diagnostics.Process及其OutputStream

但是,我生成二进制数据的过程,我需要将其作为Stream捕获,而不是文本StreamWriter

它有一种获取底层原始二进制流的方法吗?

目前,我通过启动一个类似于:

的批处理文件来破解它

myapplication | socat stdin tcp-connect:localhost:12345

在我的代码中,我创建并监听TCP套接字。虽然这个hack有效,但它有点难看,我更喜欢直接使用外部进程。

(我不能做的一件事是使用本地文件,因为数据本质上是实时的)

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

您可以使用命名管道,与Process的OutputStream功能相似但更深入(它基本上是StandardOutput的侦听器)。可以使用Streams访问命名管道,而不假设内容是Unicode字符数据。它们也不会占用网络端口,除非您想远程连接到管道(这也是可能的)。

答案 2 :(得分:1)

我使用以下代码从程序的stdout中读取二进制数据

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();