我有一个应用程序需要将输出重定向到Console.Write和Console.Writeline到其他地方。
进一步详细说明,我的代码以一定的时间间隔开始一个过程。这个过程不是由我或我工作的公司编写的,而且我没有源代码访问权限。 我从那个进程中捕获了那个输出,因为我需要知道什么时候如果出现故障我会在以后检查日志,以及类似的东西,所以我将输出重定向到这样的文本文件:
String filename = "the-log-file-with-a-datetime-stamp.txt";
FileStream filestream = new FileStream(filename, FileMode.Create);
streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);
这样做很好,但是我希望能够重定向到多个地方,就像我知道重定向到一个编写者一样。
让我们说,为了论证,我希望它重定向到streamwriter并在数据库的表中写入行,并在控制台中显示它,如果有人手动运行该程序。 我该怎么做呢?
我可以实现自己的TextWriter并在那里处理它,如果是,怎么做?
如果我能进一步澄清,请告诉我。
答案 0 :(得分:2)
最简单的方法是按照您的建议并编写自己的TextWriter
派生类。然后,您可以使用它来写入多个其他TextWriter
个实例。
Documentation for TextWriter在其“对继承人的说明”中说:
派生类必须最低限度地实现TextWriter.Write(Char)方法,以创建一个有用的TextWriter实例。
因此,派生的TextWriter
类看起来像:
public class MultiTextWriter: TextWriter
{
private List<TextWriter> _writers = new List<TextWriter>();
public void AddWriter(TextWriter writer)
{
_writers.Add(writer);
}
public override void Write(char ch)
{
foreach (var writer in _writers)
{
try
{
writer.Write(ch);
}
catch (ObjectDisposedException)
{
// handle exception here
}
catch (IOException)
{
// handle exception here
}
}
}
}
并使用它......
MultiTextWriter Writer = new MultiTextWriter();
StreamWriter sw1 = new StreamWriter(...);
StreamWriter sw2 = new StreamWriter(...);
Writer.AddWriter(sw1);
Writer.AddWriter(sw2);
Console.SetOut(Writer);
Console.SetError(Writer);
请注意,我的课程和示例非常简单。特别是,您需要添加关闭各个流的代码。你必须决定如何处理写入错误。
如果希望获得更好的性能,可以覆盖其他TextWriter
写入方法,但很有可能只是覆盖Write(char)
方法才能表现得足够好。这取决于数据输出量和目的地数量。
答案 1 :(得分:0)
将输出重定向到MemoryStream,并监视它(循环+睡眠)。数据到达后,将其发送到您需要的任何地方。
答案 2 :(得分:0)
答案 3 :(得分:0)
解决方案示例:编写自己的类,该类派生自TextWriter,它将输出回显到StreamWriter和您的其他位置。