How can I update the current line in a C# Windows Console App?提供了一些选项,说明如何刷新写入控制台的文本行。 很遗憾,如果将控制台应用的输出重定向到文件,则所有主要选项都无法正常工作。
MyApp.exe > outfile.txt
有没有办法更新写入控制台的行与输出重定向一起使用?
例如,使用以下任何一种方法,我可以在处理记录时刷新屏幕上的Processing xx of yyyy
行。如果应用程序在处理完成之前中止,Processing
行将反映成功处理的最后一行(只要应用程序没有死将更新该行)。当Console.Out被重定向时,我希望输出文件能够实时更新。
使用回车方法,旧行和新行都将写入输出文件:
Console.Write("Processed 1 of 10");
Console.Write("\rProcessed 2 of 10");
结果:
Processed 1 of 10Processed 2 of 10
操纵光标位置会使应用程序崩溃:
Console.Write("Processed 1 of 10");
Console.SetCursorPosition(Console.CursorLeft - 7, Console.CursorTop);
Console.Write("2 of 10");
原因:
Unhandled Exception: System.ArgumentOutOfRangeException: The value must
be great er than or equal to zero and less than the console's buffer size
in that dimension.
Parameter name: left
Actual value was -7.
退格方法将两行输出到文件以及退格字符:
Console.WriteLine("Processed 1 of 10");
Console.Write("\b\b\b\b\b2 of 10");
产地:
Processed 1 of 10
{5 backspace characters}2 of 10
答案 0 :(得分:1)
这不可能以你期望的方式工作。当输出被重定向时,甚至“当前行”的概念也最多模糊。
重定向输出时,改变屏幕上光标位置的控制台方法/属性无意义。
重定向的输出是顺序的,所以一旦有什么东西写入输出文件,它就在那里。
您应该考虑一种不同的策略,即如果检测到输出被重定向,则更改您的编写方式和内容。分别使用Console.IsOutputRedirected
和/或Console.IsErrorRedirected
。
例如:
if (Console.IsOutputRedirected) {
// Simply output every "line" as it comes.
Console.WriteLine(text);
} else {
// Overwrite the "current line" with the next, if any.
Console.Write(text);
Console.SetCursporPosition(0, Cursor.CursorTop);
}