将标准输出异步读取到字节数组
本文关键字:到字节 数组 读取 异步 标准输出 | 更新日期: 2023-09-27 18:34:05
我一直试图让它在这里使用几个教程/答案,但不幸的是无法做到这一点。
我想做的是执行一个进程,捕获其 DefaultOutput 并将其添加到字节数组中。到目前为止,我得到的是:
private void startProcess(string path, string arguments)
{
Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.Arguments = arguments;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.OutputDataReceived += p_OutputDataReceived;
p.EnableRaisingEvents = true;
p.Start();
p.BeginErrorReadLine();
p.BeginOutputReadLine();
p.WaitForExit();
}
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
string str = e.Data;
// what goes here?!
}
我现在的问题是:如何将这些数据添加到(不断增长的)字节数组中,或者是否有另一种数据类型更适合此目的?我也不确定在哪里声明这个目标字节数组,最好它在startProcess
方法中的某个地方,这样我就可以在进程退出后继续处理数据,但是我怎么能把它传递给p_OutputDataReceived
?
谢谢!
你可以尝试一个内存流;它确实做了你想做的事情。
数组
在 C# 中是不可变的,因此不能有一个不断增长的数组。这就是List<T>
的目的。
如果您不关心字符编码,只需执行以下操作:
List<byte> OutputData = new List<byte>(); //global
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
string str = e.Data;
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
OutputData.AddRange(bytes);
}
如果需要显式编码:
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
string str = e.Data;
byte[] bytes = Encoding.ASCII.GetBytes(str); //or replace ASCII with your favorite
//encoding
OutputData.AddRange(bytes);
}
如果你真的想要一个字节数组,只需做:
byte[] OutputDataAry = OutputData.ToArray();
老实说,我认为List<string>
会是一个更干净的方法,但你要求byte[]
所以我给你一个byte[]
.
如果您想一次读取整个输出,以下代码将帮助您...
static void Main(string[] args)
{
StreamReader reader;
Process p = new Process();
p.StartInfo.FileName = "cmd";
p.StartInfo.Arguments = "/c echo hi";
p.StartInfo.UseShellExecute = false;
p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
reader = p.StandardOutput;
byte[] result = Encoding.UTF8.GetBytes(reader.ReadToEnd());
Console.WriteLine(result.ToString());
Console.WriteLine(Encoding.UTF8.GetString(result));
Console.ReadLine();
}
如果没有,您必须调用除 ReadToEnd 之外的另一种方法,并在线程中使用 StreamReader 来连续读取数据......而不是字节数组,如果你想要一个不断增长的集合,你可以使用列表或类似的东西......另请检查与其他线程组合的同步集合 http://msdn.microsoft.com/en-us/library/ms668265(v=vs.110).aspx