如何在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);
}
答
我认为这个问题是你的参考方法在功能capturePackets年底走出去的范围。您需要为流程变量赋予与作者相同的范围,或者等待capturePackets函数,直到流程使用WaitForExit()方法退出。尽管您创建的过程继续运行,但当对其引用超出范围(通过过程变量)时,事件将停止处理。
+0
你知道,我实际上已经想到了这一点,完全忘了.WaitForExit方法,并准备编写一个方法来检查PID是否已退出。那虽然,但是,谢谢。 – user1632018
只是一个旁注,但StreamWriter是一次性的,应该用“Using Statement”包装或在完成当前操作后调用Dispose()。 – Amicable
谢谢Amicable。我实际上是用一个using语句来包装它,然后为了调试目的而删除它。感谢您的建议,我现在正在使用.Dispose()。 – user1632018