我一直试图在这里使用几个教程/答案,但遗憾的是无法这样做。
我想要做的是执行一个进程,捕获它的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
方法的某个地方,所以我可以在流程退出后继续使用数据,但是我怎么能把它传递给{{1 }}?
谢谢!
答案 0 :(得分:2)
您可以尝试使用内存流;它确实做了你想做的事。
答案 1 :(得分: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[]
。
答案 2 :(得分: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
的组合