将控制台输出重定向到TextBox,WPF应用程序时出错

时间:2014-06-16 05:00:24

标签: c# wpf

我正在尝试将控制台输出重定向到我的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

在我开始流程时遇到错误。

当我在命令提示符下运行它时,它工作正常。 我错过了什么? 任何帮助。

1 个答案:

答案 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流上启动异步读取操作。此方法为流输出启用指定的事件处理程序,并立即返回到调用方,调用方可以在将流输出定向到事件处理程序时执行其他工作。

但是,我可以看到你已经这样做了,所以我只能建议你有一些其他代码导致你的错误。如果它显示系统找不到指定的文件,则很可能是您的一个或多个文件路径无效。