【问题标题】:How to capture binary process output in C#/.NET如何在 C#/.NET 中捕获二进制进程输出
【发布时间】:2010-12-13 18:56:51
【问题描述】:

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

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

有没有办法获取底层的原始二进制流?

目前,我通过启动一个看起来像这样的批处理文件来破解它:

myapplication | socat stdin tcp-connect:localhost:12345

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

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

【问题讨论】:

    标签: c# .net streaming


    【解决方案1】:

    【讨论】:

    • 给个完整的答案怎么样?
    • @SerG:这是一个完整的答案。唯一被问到的问题是“它 [原文如此] 有没有办法获得底层的原始二进制流?”
    【解决方案2】:

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

    【讨论】:

    • 但是你需要修改子进程使其使用管道,否则 p/invoke CreateProcess 将管道作为子进程的标准输出句柄传递。
    【解决方案3】:

    我使用以下代码从程序的标准输出读取二进制数据

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

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多