获取进程的二进制输出和错误文本

时间:2018-01-03 08:47:38

标签: c# process binary redirectstandardoutput

我想运行一个exe实用程序,它根据给定的参数生成一些二进制输出(这是一个图像)。 我需要将实用程序的二进制输出作为流(MemoryStream)和错误(如果有)。 它还需要 Timeout ,这样如果应用程序挂起或需要很长时间才能响应,请中断执行并返回输出结果,直到该时间为止。

一种方法是使用cmd,如:

cmd /C ... >out.jpg 2>err.txt

但这需要一个不可接受的临时文件,我想直接捕获输出数据,因为它应该多次调用并且输出大小很大。

运行流程的基本代码如下:

using (var p = new Process())
{
    //p.StartInfo = new ProcessStartInfo("cmd", "/C " + command + " > x.jpg 2> err.txt");
    p.StartInfo = new ProcessStartInfo()
    {
        FileName = @"x.exe", //dcraw
        Arguments = @"-c -e x.jpg", 
        UseShellExecute = false, //it is usefull for non-exe like as for a Word file.
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true,
        WindowStyle = ProcessWindowStyle.Hidden
    };
    int timeout = 5000; //msec

    p.Start();

    //MemoryStream outputStream = ...
    //p.OutputDataReceived += ... //can't use this as it returns text not binary data

    //string errorText = ...

    p.WaitForExit();

    //return new pResult(Image.FromStream(outputStream), errorText, isTimedout, ...);

}

如何使用指定的超时获取outputStream和errorText?

注意:我知道有几个关于process.start和输出重定向的问题。其中大多数是关于捕获文本输出而不是二进制数据(如thisthat)。这个binary question并没有像我这里所说的那样完全回答我的问题(同时捕获输出和错误可能导致死端锁,没有指定超时)。

0 个答案:

没有答案