将标准输出异步读取到字节数组

本文关键字:到字节 数组 读取 异步 标准输出 | 更新日期: 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