0

我一直试图让这个与这里的几个教程/答案一起工作,但不幸的是无法这样做。

我想做的是执行一个进程,捕获它的 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呢?

谢谢!

4

3 回答 3

1

数组在 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>这会是一种更清洁的方法,但你要求 abyte[]所以我给你一个byte[].

于 2014-07-23T15:10:59.340 回答
1

你可以试试内存流;它真的做了你想做的事。

于 2012-05-13T14:04:29.777 回答
0

如果您想一次阅读整个输出,以下代码将帮助您...

    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

于 2014-07-21T20:02:35.447 回答