如何保存控制台应用程序的输出

And*_*lla 10 .net c# console stdout

我需要有关如何让我的C#控制台应用程序通过标准输出向用户显示文本的建议,同时仍然可以在以后访问它.我想实现的实际功能是在程序执行结束时将整个输出缓冲区转储到文本文件中.

我使用的解决方法,虽然我找不到更清晰的方法是子类TextWriter重写写入方法,所以他们都会写入文件并调用原始的stdout编写器.像这样的东西:

public class DirtyWorkaround {
  private class DirtyWriter : TextWriter {
    private TextWriter stdoutWriter;
    private StreamWriter fileWriter;

    public DirtyWriter(string path, TextWriter stdoutWriter) {
      this.stdoutWriter = stdoutWriter;
      this.fileWriter = new StreamWriter(path);
    }

    override public void Write(string s) {
      stdoutWriter.Write(s);

      fileWriter.Write(s);
      fileWriter.Flush();
    }

    // Same as above for WriteLine() and WriteLine(string),
    // plus whatever methods I need to override to inherit
    // from TextWriter (Encoding.Get I guess).
  }

  public static void Main(string[] args) {
    using (DirtyWriter dw = new DirtyWriter("path", Console.Out)) {
      Console.SetOut(dw);

      // Teh codez
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

看到它一直写入并刷新文件.我只想在执行结束时才这样做,但我找不到任何方法来访问输出缓冲区.

另外,请原谅上述代码的不准确之处(不得不临时写,抱歉;).

Jas*_*hen 5

我不认为你的做法有什么问题。

如果您想要可重用的代码,请考虑实现一个名为MultiWriter或类似的类,该类将两个(或 N?)个流作为输入TextWriter,并将所有命令、刷新等分发到这些流。然后你可以做这个文件/控制台的事情,但你也可以轻松地分割任何输出流。有用!


Mik*_*all 5

对此的完美解决方案是将log4net与控制台appender和文件追加器一起使用.还有许多其他appender也可用.它还允许您在运行时关闭和打开不同的appender.

  • 我同意log4net是一个相当重要的依赖. (3认同)
  • 我认为在这种情况下,使用第三方库可能会有些过分,因为只需要少量工作就可以为系统添加必要的功能. (2认同)