我是一名编程老师,我正在为学生HW(所有是控制台应用程序)开发自动检查程序。基本上,我使用一些Process.Start()(带有一些输入文件)运行学生代码,并检查它的输出是否符合预期。 如果由于某种原因,学生代码没有成功完成,我会使用进程标准错误重定向向他们发送代码抛出的异常。
然而,我想做得更好。我想找到写入进程StandartInput的输入行,然后发生异常。我怎样才能做到这一点?我当前的代码或多或少:
ProcessStartInfo psi = new ProcessStartInfo(students_exe_path);
psi.UseShellExecute = false;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
String randomInputFile = randomInputFilesFolder + "\\" + "test.txt";
psi.WorkingDirectory = randomInputFilesFolder;
Process p = Process.Start(psi);
StreamWriter inputWriter = p.StandardInput;
String[] inputLines = File.ReadAllLines(randomInputFile);
foreach (String line in inputLines)
{
// here I wanted to read the standart error so far (before writing next input line)
String errorTextBefore = p.StandardError.ReadToEnd(); // can not use this because blocks progress.
inputWriter.WriteLine(line); // sending next input line to students app
// here I wanted to read the standart error so far (after writing next input line)
String errorTextAfter = p.StandardError.ReadToEnd(); // can not use because blocks
if (errorTextBefore != errorTextAfter) Console.WriteLine("Line {0} caused the exception",line);
}
或许我可以从p.StandartInput检查哪个文本没有被这个过程“消耗”?
塔米尔