C# - 从外部命令行应用程序逐字节读取标准输出

时间:2010-05-12 15:24:32

标签: c#

我正在寻找一种从外部命令行应用程序逐字节读取标准输出的方法。

当前代码有效,但仅在添加换行符时才有效。有没有办法逐字节读取当前行输入,所以我可以用进度更新用户。

例)

Proccesing file

0%   10   20   30   40   50   60   70   80   90   100%

|----|----|----|----|----|----|----|----|----|----|

xxxxxx

在控制台应用程序中每隔几分钟添加一次x,但不会在我的c#Win表单中添加,因为只有在完成当前行(结束)时才会更新

示例代码:

Process VSCmd = new Process();
VSCmd.StartInfo = new ProcessStartInfo("c:\\testapp.exe");
VSCmd.StartInfo.Arguments = "--action run"
VSCmd.StartInfo.RedirectStandardOutput = true;
VSCmd.StartInfo.RedirectStandardError = true;
VSCmd.StartInfo.UseShellExecute = false;
VSCmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
VSCmd.StartInfo.CreateNoWindow = true;

VSCmd.Start();

StreamReader sr = VSCmd.StandardOutput;

while ((s = sr.ReadLine()) != null)
{
   strLog += s + "\r\n";
   invoker.Invoke(updateCallback, new object[] { strLog });
}


VSCmd.WaitForExit();

2 个答案:

答案 0 :(得分:2)

尝试使用StreamReader.Read()从流中读取下一个可用字符,而无需等待整行。此函数返回int,其中-1表示已到达流的末尾,否则可以强制转换为char

答案 1 :(得分:0)

以下将逐字符构建strLog,我假设你想为每一行调用updateCallback,当然如果不是这样,那么你可以删除对新行的检查。

  int currChar;
  int prevChar = 0;
  string strLog = string.Empty;
  while ((currChar = sr.Read()) != -1)
  {
    strLog += (char)currChar; // You should use a StringBuilder here!
    if (prevChar == 13 && currChar == 10) // Remove if you need to invoke for each char
    {
      invoker.Invoke(updateCallback, new object[] { strLog });
    }

    prevChar = currChar;
  }