.Net控制台应用程序 - 以与输出重定向

时间:2015-09-22 12:59:00

标签: c# console-application io-redirection

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

1 个答案:

答案 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);
 }