C# 如何在C语言中将控制台应用程序连续输出到文本文件#
我试图用参数打开一个隐藏的控制台应用程序,基本上将其输出连续记录到一个文件中,直到停止为止 我尝试过使用一个内存流并将其写入文件中,它似乎确实起了一些作用。现在我试图利用DataReceiveDevent,以便进一步处理输出。现在我没有得到任何输出 以下是我如何打开console应用程序:C# 如何在C语言中将控制台应用程序连续输出到文本文件#,c#,.net,console-application,tshark,C#,.net,Console Application,Tshark,我试图用参数打开一个隐藏的控制台应用程序,基本上将其输出连续记录到一个文件中,直到停止为止 我尝试过使用一个内存流并将其写入文件中,它似乎确实起了一些作用。现在我试图利用DataReceiveDevent,以便进一步处理输出。现在我没有得到任何输出 以下是我如何打开console应用程序: StreamWriter writer = new StreamWriter("tsharkfieldoutput.txt", true) private void capturePackets(int d
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结束时,您对流程的引用超出了范围。您需要为流程变量指定与writer相同的作用域,或者使用WaitForExit()方法在capturePackets函数中等待流程退出。尽管您创建的流程将继续运行,但当对它的引用超出范围(通过流程变量)时,事件将停止处理。只是一个旁注,但StreamWriter是一次性的,应该包装在“Using语句”中,或者在您完成当前操作时调用Dispose()。谢谢。我实际上是用using语句包装它,然后出于调试目的删除了它。感谢您的建议,我现在正在使用.Dispose()。您知道,我实际上已经想到了这一点,并且完全忘记了.WaitForExit方法,并且打算编写一个方法来不断检查PID,看看它是否已经退出。不过,这确实奏效了,谢谢。