2013-07-16 58 views
0

我试图创建一个minecraft服务器包装,但即时通讯读取过程的输出有困难。我想读取serverProcess_ErrorDataRecevied事件中的输出,我知道现在有什么不起作用。但是我可以放什么来阅读它?如何从过程输出读取

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.IO; 

namespace MC_Server_UI 
{ 
    public partial class Form1 : Form 
    { 
     ProcessStartInfo startInfo = new ProcessStartInfo("C:\\Program Files (x86)\\Java\\jre7\\bin\\java.exe", "Xmx1024M - jar " + "craftbukkit.jar" + " nogui"); 
     Process serverProcess; 

     OpenFileDialog ofd; 
     FolderBrowserDialog fbd; 

     public Form1() 
     { 
      InitializeComponent(); 

      fbd = new FolderBrowserDialog(); 
      fbd.ShowDialog(); 

      startInfo.WorkingDirectory = fbd.SelectedPath; 
      startInfo.RedirectStandardInput = startInfo.RedirectStandardError = true; 
      startInfo.UseShellExecute = false; 
      startInfo.CreateNoWindow = true; 

      serverProcess = new Process(); 
      serverProcess.StartInfo = startInfo; 
      serverProcess.EnableRaisingEvents = true; 
      serverProcess.ErrorDataReceived += new DataReceivedEventHandler(serverProcess_ErrorDataReceived); 
      serverProcess.Exited += new EventHandler(serverProcess_Exited); 
      serverProcess.Start(); 
     } 

     private void serverProcess_ErrorDataReceived(object sender, EventArgs e) 
     { 
      richTextBox1.AppendText(serverProcess.StandardError.ReadToEnd()); 
     } 

     private void serverProcess_Exited(object sender, EventArgs e) 
     { 

     } 
    } 
} 

回答

0

参见:

代码:

serverProcess.StartInfo.RedirectStandardOutput = true; 
serverProcess.OutputDataReceived += (sender, args) => Console.WriteLine("received output: {0}", args.Data); 
serverProcess.Start(); 
serverProcess.BeginOutputReadLine(); 

或者:

serverProcess.StartInfo.RedirectStandardOutput = true; 
var output = serverProcess.StandardOutput.ReadToEnd(); 

参见:ProcessStartInfo.RedirectStandardError

serverProcess.StartInfo.RedirectStandardError = true; 
var error = serverProcess.StandardError.ReadToEnd(); 
+0

我没有看到如何回答我的问题。我重定向了流并使用.ReadToEnd不起作用。 – user2587567

+0

“StandardError”和“StandardOutput”是一个“StreamReader”。您可以使用它从流程中提取输出。 'OutputDataReceived'是一个也可以工作的事件。 – Romoku

+0

经过一些测试后,我注意到事件只会触发,如果我已经完成.BeginErrorReadLine但使用.ReadToEnd然后将引发异常。 – user2587567