题
我需要建议如何有我的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
在新行可能是可取的,但这是另一个棘手的蠕虫可以工作了。