复制自进程的控制台输出
本文关键字:控制台 输出 进程 复制 | 更新日期: 2023-09-27 18:05:03
我想将我的流程控制台输出重定向到file,同时保持在当前附加的控制台上显示它的实用程序。
重定向很容易完成:
using (FileStream fs = new FileStream(TestLogName("Texture"), FileMode.Create, FileAccess.Write)) {
Console.SetOut(new StreamWriter(fs));
...
Console.Out.Flush();
}
但是,我如何在已经连接的控制台上保持控制台输出(事实上复制流)的同时实现相同的结果?
你可以用一个写文件的类和另一个TextWriter类来子类化TextWriter。然后用System.Console.Out的当前值初始化该类的实例。
var writer = new SplitWriter(Console.Out, @"c:'temp'logfile.txt");
Console.SetOut(writer);
SplitWriter然后负责写入文件和Console.Out的原始值。
您可以将控制台和日志文件附加为跟踪侦听器,并将控制台写入方法的所有用法替换为Trace:
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new DefaultTraceListener{LogFileName="C:'temp'myOutput.txt"});
...
Trace.Flush();
Trace.Listeners.Clear();
理解Trace,不像Console,不能被读取,所以如果你曾经使用过Console。如果想要记录用户的输入,则需要将其"echo"回发给跟踪侦听器。
如果你想更扎实一点,你可以设置一个ioutputwwriter接口,然后实现三个类;一个写入控制台,一个写入文件,第三个具有其他IOutputWriters集合,并将对其方法的任何调用路由到所有附加的IOutputWriters。它使用Composite和Adapter模式来规范程序和监听它的任何内容之间的接口。这避开了内置的Trace/Debug功能,但是如果您已经将其用于不同级别的消息传递,或者您需要消息传递的工作方式与Trace提供的默认方式略有不同,则可以使用alternate。
我认为你必须调用WinAPI函数,如WriteConsoleOutput。我认为在多线程环境中转发所有其他写入是不可能的。