C# .Net控制台应用程序-以与输出重定向配合使用的方式更新当前行

C# .Net控制台应用程序-以与输出重定向配合使用的方式更新当前行,c#,console-application,io-redirection,C#,Console Application,Io Redirection,提供有关如何刷新写入控制台的文本行的多个选项不幸的是,如果控制台应用程序的输出被重定向到文件,则所有主要选项都无法正常工作。 MyApp.exe > outfile.txt 是否有方法更新写入控制台的行,该行与输出重定向一起工作 例如,使用以下任一方法,我可以在处理记录时刷新屏幕上的行Processing xx of yyyy。如果应用程序在处理完成之前中止,则处理行将反映成功处理的最后一行(只要应用程序没有死掉,就会更新该行)。当Console.Out被重定向时,我希望输出文件也能实

提供有关如何刷新写入控制台的文本行的多个选项不幸的是,如果控制台应用程序的输出被重定向到文件,则所有主要选项都无法正常工作。

 MyApp.exe > outfile.txt
是否有方法更新写入控制台的行,该行与输出重定向一起工作

例如,使用以下任一方法,我可以在处理记录时刷新屏幕上的行
Processing xx of yyyy
。如果应用程序在处理完成之前中止,则
处理
行将反映成功处理的最后一行(只要应用程序没有死掉,就会更新该行)。当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.
退格 backspace方法将两行连同backspace字符一起输出到文件:

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

这不可能按你期望的方式工作。当输出被重定向时,即使是“当前线路”的概念也充其量是模糊的

  • 重定向输出时,改变屏幕上光标位置的控制台方法/属性没有意义

  • 重定向的输出是连续的,所以一旦有东西写入输出文件,它就在那里了

<>你应该考虑一个不同的策略,即如果你检测到输出重定向,那么改变你写的方式和方法。分别使用
控制台.IsOutputRedirected
和/或
控制台.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);
 }

那么,您希望在输出文件中看到什么?有一行写着“处理了10个,共10个”?如果旧行已经写入文件,您希望它如何工作??您要求输出重定向返回并有条件地从文件中删除数据。这是不可能发生的。你需要指定你认为是“工作”的解决方案。请给出一个您认为可以接受的输出示例。仅仅说“这不是我想要的”是不够的,你需要说你想要的。@LasseV.Karlsen——例子补充道。让我澄清一下我的意思。我的意思是你需要解释在运行程序后文件的内容应该是什么。同一个程序在处理文件时会更新屏幕上的文本,如果您将其重定向到一个文件,在程序执行后,该文件的内容应该是什么?