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——例子补充道。让我澄清一下我的意思。我的意思是你需要解释在运行程序后文件的内容应该是什么。同一个程序在处理文件时会更新屏幕上的文本,如果您将其重定向到一个文件,在程序执行后,该文件的内容应该是什么?