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

あなたはメモリストリームを試すかもしれません。それは本当にあなたがやろうとしていることをします。

于 2012-05-13T14:04:29.777 に答える
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>ははるかにクリーンなアプローチになると思いますが、あなたはそう求めているbyte[]ので、私はあなたにを与えますbyte[]

于 2014-07-23T15:10:59.340 に答える
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 に答える