我正在寻找一种从外部命令行应用程序逐字节读取标准输出的方法。
当前代码有效,但仅在添加换行符时才有效。有没有办法逐字节读取当前行输入,所以我可以用进度更新用户。
例)
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();
答案 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;
}