如何在C#中连续输出控制台应用程序到文本文件#

如何在C#中连续输出控制台应用程序到文本文件#

问题描述:

我想打开一个带有参数的隐藏控制台应用程序,并且基本上将它的输出记录到文件中,直到它停止。如何在C#中连续输出控制台应用程序到文本文件#

我尝试过使用内存流并将其写入文件,它确实似乎工作了一下。现在我正在尝试利用DataRecievedEvent,以便进一步处理输出。现在我没有得到任何输出。

这里是我正在打开控制台应用程序:

StreamWriter writer = new StreamWriter("tsharkfieldoutput.txt", true) 

private void capturePackets(int device) 
     { 

      string path = 
       string.Format("-i " + device + 
           " -O SNMP -T fields -e snmp.value.oid -e snmp.VarBind -e snmp.variable_bindings -e snmp.value.octets -e snmp.name -R udp src " + 
           destPort); 
      string tshark = @"C:\Program Files\Wireshark\tshark.exe"; 
      ProcessStartInfo ps = new ProcessStartInfo(); 
      ps.FileName = tshark; 
      ps.CreateNoWindow = true; 
      ps.WindowStyle = ProcessWindowStyle.Hidden; 
      ps.UseShellExecute = false; 
      ps.CreateNoWindow = true; 
      ps.RedirectStandardOutput = true; 
      ps.Arguments = path; 
      Process process = new Process(); 
      process.StartInfo = ps; 
      process.Start(); 
      process.OutputDataReceived += new DataReceivedEventHandler(tshark_OutputDataReceived); 
      //Not using stream reader any more. 
      //StreamReader myStreamReader = process.StandardOutput; 
      writer.Write("Begin tshark output- " + DateTime.Now + " - " + Environment.NewLine); 

     } 

     private void tshark_OutputDataReceived(object sender, DataReceivedEventArgs arg) 
     { 
      string tsharkline = arg.Data; //arg.Data contains the output data from the process...   

       writer.Write(tsharkline); 

     } 
+2

只是一个旁注,但StreamWriter是一次性的,应该用“Using Statement”包装或在完成当前操作后调用Dispose()。 – Amicable

+1

谢谢Amicable。我实际上是用一个using语句来包装它,然后为了调试目的而删除它。感谢您的建议,我现在正在使用.Dispose()。 – user1632018

我认为这个问题是你的参考方法在功能capturePackets年底走出去的范围。您需要为流程变量赋予与作者相同的范围,或者等待capturePackets函数,直到流程使用WaitForExit()方法退出。尽管您创建的过程继续运行,但当对其引用超出范围(通过过程变量)时,事件将停止处理。

+0

你知道,我实际上已经想到了这一点,完全忘了.WaitForExit方法,并准备编写一个方法来检查PID是否已退出。那虽然,但是,谢谢。 – user1632018