我需要建议如何有我的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
    }
  }
}

看到它写和刷新文件的时间。我喜欢这样做只有在结束的执行,但是我没找到任何方式访问产出的缓冲区。

此外,借口的不精确性与上述代码(不得不写 特设, 抱歉;).

有帮助吗?

解决方案

完美的解决方案,这是使用 log4net 与一种控制台信息输出目的地和文件存放器.还有许多其他的附加程序。它还允许你打开不同的附加程序关闭并在运行时间。

其他提示

我不认为有什么错你的方法。

如果你想可重复使用的代码,考虑实施一类称为 MultiWriter 或somesuch,需要作为输入两个(或N?) TextWriter 流和分发的所有令状,同花,等等。那些流。然后你可以做到这一文件/控制台的事情,但只是作为容易,你可以拆分输出任何流。有用的!

可能不是你想要的,但仅在情况下...显然, PowerShell实现了 一个版本的古老 tee 命令。这是相当多的目的正是这个目的。所以...烟'时间如果你得到了他们。

我会说模仿的诊断。净本身使用(跟踪和调试).

创建一个"输出"类可以有不同的课程,坚持要文本输出接口。你的报告给出的输出类时,它会自动发送给出的输出类添加(ConsoleOutput,TextFileOutput,WhateverOutput)..等等..这还让你打开添加其他"输出"的类型(例如xml/xslt得到一个很好的格式报告吗?).

检查出来的 微量听众收集 看什么我的意思。

考虑重构应用到单独的用户相互作用的部分从业务逻辑。以我的经验,这种分离是很有益的结构程序。

对特定问题你想在这里解决,它变得简单明了的用户相互作用的一部分,以改变其行为 Console.WriteLine 文件I/O.

我正在执行一个类似的功能捕捉输出控制台发送和保存到一个日志,同时还通过实时输出到正常的控制台,因此它不断的应用程序(如。如果这是控制台应用程序的!).

如果你还试图做到这一点,在自己的代码由省控制台输出(而不是使用记录系统保存的信息你真关心有关),我认为你可以避免的冲洗后的每一个编写,因为只要你还复盖Flush()并确保它刷新原始 stdoutWriter 你保存以及你的 fileWriter.你想要做到这一情况下的应用程序是想要冲洗一部分行控制台,立即显示器(例如输入的提示,一个进展指标等),以替代正常的线的缓冲。

如果这种做法有问题,你的台输出,正在缓冲过长,你可能会需要确保有关()潮 stdoutWriter (但是可能不需要冲洗 fileWriter 除非你Flush()替代被称为).但我认为原 Console.Out (实际上是要控制台)将自动刷新其缓冲器后,一个新行,所以你不应该强迫它。

你可能还要复盖Close()至(冲及)接近你的 fileWriter (而且很可能 stdoutWriter 作),但是我不知道如果这是真正需要的,或者如果一个Close()中的基本形式将会发出一个Flush()(其中已经复盖)和可能依靠应用程序的退出以闭上你的文件。你也许应该试验,它被冲上退出,以确保万无一失。并且应注意异常的出口(崩溃)可能不齐的缓冲输出。如果这是一个问题,冲洗 fileWriter 在新行可能是可取的,但这是另一个棘手的蠕虫可以工作了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top