Exemple #1
0
        public static ExecuteResult Execute(ExecuteArgs executeArgs, IExecuteController controller = null, NPath outputFile = null)
        {
            using (var p = NewProcess(executeArgs))
            {
                FileStream fOut, fError;
                string     tempOutputFile, tempErrorFile;

                lock (FileLocker)
                {
                    tempOutputFile = outputFile == null?Path.GetTempFileName() : outputFile.ToString();

                    tempErrorFile = Path.GetTempFileName();
                    fOut          = File.Create(tempOutputFile);
                    fError        = File.Create(tempErrorFile);
                }

                var stopWatch = new Stopwatch();
                stopWatch.Start();

                using (
                    StreamWriter outputWriter = new StreamWriter(fOut, Encoding.UTF8),
                    errorWriter = new StreamWriter(fError, Encoding.UTF8))
                {
                    p.OutputDataReceived += (sender, args) =>
                    {
                        outputWriter.WriteLine(args.Data);
                        if (controller != null)
                        {
                            controller.OnStdoutReceived(args.Data);
                        }
                    };
                    p.ErrorDataReceived += (sender, args) =>
                    {
                        errorWriter.WriteLine(args.Data);
                        if (controller != null)
                        {
                            controller.OnStderrReceived(args.Data);
                        }
                    };
                    lock (PipeLocker)
                    {
                        p.Start();
                        p.BeginOutputReadLine();
                        p.BeginErrorReadLine();
                    }

                    p.WaitForExit();
                    p.CancelErrorRead();
                    p.CancelOutputRead();
                }

                string output = "";
                string error;
                lock (FileLocker)
                {
                    if (controller != null)
                    {
                        controller.AboutToCleanup(tempOutputFile, tempErrorFile);
                    }

                    if (outputFile == null)
                    {
                        output = File.ReadAllText(tempOutputFile, Encoding.UTF8);
                        File.Delete(tempOutputFile);
                    }

                    error = File.ReadAllText(tempErrorFile, Encoding.UTF8);
                    File.Delete(tempErrorFile);
                }

                stopWatch.Stop();
                var result = new ExecuteResult()
                {
                    ExitCode = p.ExitCode,
                    StdOut   = outputFile == null ? output : "in outputfile",
                    StdErr   = error,
                    Duration = TimeSpan.FromMilliseconds(stopWatch.ElapsedMilliseconds)
                };

                return(result);
            }
        }