我想启动外部应用程序,并捕获其输出。
这很简单,使用 Diagnostics.Process
及其OutputStream
。
但是,我生成二进制数据的过程,我需要将其作为Stream
捕获,而不是文本StreamWriter
它有一种获取底层原始二进制流的方法吗?
目前,我通过启动一个类似于:
的批处理文件来破解它
myapplication | socat stdin tcp-connect:localhost:12345
在我的代码中,我创建并监听TCP套接字。虽然这个hack有效,但它有点难看,我更喜欢直接使用外部进程。
(我不能做的一件事是使用本地文件,因为数据本质上是实时的)
答案 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();