【问题标题】:flush console window contents to a streamwriter text file将控制台窗口内容刷新到流写入器文本文件
【发布时间】:2013-09-16 13:00:22
【问题描述】:

我在运行控制台应用程序时将统计信息发送到控制台窗口。我想定期将控制台的内容刷新到文本文件,以及程序何时关闭以及是否关闭。我认为 console.out.writeline() 会起作用,但它不会产生价值。我无法跟踪写入控制台窗口的所有内容,因此基本上每 6 小时后,我只想将当时显示的所有内容写入文本文件。只是想知道这是否可能。提前致谢。

【问题讨论】:

标签: .net visual-studio-2010 console


【解决方案1】:

考虑到所有因素,您最好使用将记录到控制台和文件的东西。因此,您无需调用Console.WriteLine,而是调用Logger.WriteLine,它会同时写入两者。

可以从控制台读取并写入文件,但这有点困难,而且并不完美。控制台屏幕缓冲区只能容纳这么多。如果您要输出大量数据,其中一些数据会被推出缓冲区。

您可以通过更改控制台窗口的属性来设置屏幕缓冲区的大小。

如果要从控制台读取数据,则必须读取控制台屏幕缓冲区。 .NET Console 类不提供对它的访问。您最终必须调用 Windows API 函数来执行此操作。

几年前,我为一系列关于使用 .NET 中的 Console API 的文章开发了代码。不幸的是,发布这些文章的网站不再在线。但代码可在http://www.mischel.com/pubs/consoledotnet.zip 获得。

如果您想使用该代码来获取控制台的内容,您可以执行以下操作:

Get the active console screen buffer by calling JConsole.GetActiveScreenBuffer
Call GetScreenBufferInfo to get the size of the screen buffer
Call ReadBlock to read as much of the buffer as you want

这将返回一个由ConsoleCharInfo 结构组成的二维数组。然后,您可以通过它并获得所需的字符。

请注意,这不一定会得到输出到控制台的所有内容。相反,它将获取当前在屏幕缓冲区中的所有内容。如果应用程序写入的内容超出屏幕缓冲区的容量,您将无法获得滚动显示的信息。

【讨论】:

  • 谢谢。信息量很大。我已经考虑过我通常会做的并行记录选项,但在这种情况下,我看到我创建的计时器出现问题,6 小时后应该写入文本日志文件。所以我想,由于控制台窗口以设置格式和光标位置显示数据,我可以在任何给定点“刷新”。但正如你指出的那样并不容易。谢谢。将使用您的示例代码来测试哪种方法更好。
  • @vbNewbie:我强烈建议您使用 Hans Passant 在他的评论中提到的技术。
  • 这是一个不错的选择,但我认为在我看来,我不想在每次控制台输出时记录每一秒。我只想每 6 小时记录一次文件,我现在用计时器完成了这项工作并跟踪统计变量。
猜你喜欢
  • 2015-08-15
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多