自身进程的重复控制台输出

4

我希望能够将进程控制台输出重定向到文件,同时保持在当前附加的控制台显示它的效用。

可以使用以下命令轻松完成重定向:

using (FileStream fs = new FileStream(TestLogName("Texture"), FileMode.Create, FileAccess.Write)) {
    Console.SetOut(new StreamWriter(fs));

    ...

    Console.Out.Flush();
}

但是我如何在保持已连接控制台的情况下实现相同的结果(事实上是复制流)?
3个回答

4
您可以使用一个写入文件和另一个TextWriter类的类来子类化TextWriter。然后,使用当前值为System.Console.Out的实例初始化此类的实例。
var writer = new SplitWriter(Console.Out, @"c:\temp\logfile.txt");
Console.SetOut(writer);

SplitWriter将负责同时写入文件和控制台的原始输出值。

更快的答案!我不知道为什么我还没有利用这个!谢谢。 - Luca

2
您可以将控制台和日志文件作为跟踪侦听器附加,用 Trace 替换所有控制台写入方法的使用:
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new DefaultTraceListener{LogFileName="C:\temp\myOutput.txt"});

...       

Trace.Flush();
Trace.Listeners.Clear();

了解到,与控制台不同,Trace 无法被读取,因此如果您曾经使用 Console.ReadLine 并希望记录用户的输入,则需要将其“回显”到跟踪侦听器中。
如果您想更加 SOLID,可以设置一个 IOutputWriter 接口,然后实现三个类:一个写入控制台,一个写入文件,以及第三个具有其他 IOutputWriters 集合并将任何调用其方法的路由到所有附加的 IOutputWriters 的类。这使用组合和适配器模式来规范化程序与任何监听它的内容之间的接口。这绕过了内置的 Trace/Debug 功能,但如果您已经将其用于不同级别的消息传递,或者您的消息传递需要与 Trace 提供的默认方式略有不同,则这是一种备选方案。

0

我认为你需要调用WinAPI函数,如WriteConsoleOutput。在多线程环境中,我看不到将每个其他写操作转发的前景。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接