我正在尝试将控制台输出重定向到我的WPF应用程序TextBox。 但我得到的是异常
"The system connot find the file specified"
这是我的代码
{
string rootDir = sourcePath;
string command = CAConstants.CPPCheckCommand + sourcePath + " 2> " + rootDir + CAConstants.FileSeparator + CAConstants.CPPCHECKFileName;
using (proc = new Process())
{
// set environment variables
string pathVar = proc.StartInfo.EnvironmentVariables[CAConstants.ENV_Path];
string cppcheckPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + CAConstants.CPPCheckRootDir;
proc.StartInfo.EnvironmentVariables[CAConstants.ENV_Path] = pathVar + cppcheckPath + ";";
//set process name
proc.StartInfo.FileName = command;
proc.StartInfo.UseShellExecute = false;
// set up output redirection
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.EnableRaisingEvents = true;
proc.StartInfo.CreateNoWindow = true;
// see below for output handler
proc.ErrorDataReceived += proc_DataReceived2;
proc.OutputDataReceived += proc_DataReceived2;
proc.Start(); // Getting error at this line
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
//proc.WaitForExit();
}
}
和
void proc_DataReceived2(object sender, DataReceivedEventArgs e)
{
// output will be in string e.Data
if (!String.IsNullOrEmpty(e.Data))
{
if (!logsTextBox.Dispatcher.CheckAccess())
{
// Called from a none ui thread, so use dispatcher
ShowLoggingDelegate showLoggingDelegate = new ShowLoggingDelegate(ShowLogging);
logsTextBox.Dispatcher.Invoke(DispatcherPriority.Normal, showLoggingDelegate, e.Data);
}
else
{
// Called from UI trhead so just update the textbox
ShowLogging(e.Data);
};
}
}
private delegate void ShowLoggingDelegate(string text);
private void ShowLogging(string text)
{
logsTextBox.AppendText(text);
logsTextBox.ScrollToEnd();
}
我找到了这个链接Redirect console output to textbox in separate program
但无法解决我的错误
这是我的命令
cppcheck -v --enable=all --xml C:\\Test_projects\\52 2> C:\\Test_projects\\52\\cppcheck.xml
在我开始流程时遇到错误。
当我在命令提示符下运行它时,它工作正常。 我错过了什么? 任何帮助。
答案 0 :(得分:1)
在Visual Studio中重定向控制台的流程输出所需要做的就是将ProcessStartInfo.RedirectStandardOutput
property设置为true
,将ProcessStartInfo.UseShellExecute
property设置为false
:
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
从链接页面:
如果要将RedirectStandardOutput设置为true,则必须将UseShellExecute设置为false。否则,从StandardOutput流中读取会引发异常。
现在,您应该可以从Process.StandardOutput
Property访问StreamReader
了。从上面链接的页面:
可以同步或异步读取重定向的StandardOutput流。 Read,ReadLine和ReadToEnd等方法对进程的输出流执行同步读取操作。在关联的Process写入其StandardOutput流或关闭流之前,这些同步读取操作不会完成。
相反,BeginOutputReadLine在StandardOutput流上启动异步读取操作。此方法为流输出启用指定的事件处理程序,并立即返回到调用方,调用方可以在将流输出定向到事件处理程序时执行其他工作。
但是,我可以看到你已经这样做了,所以我只能建议你有一些其他代码导致你的错误。如果它显示系统找不到指定的文件,则很可能是您的一个或多个文件路径无效。