我想将我的进程控制台输出重定向到文件,同时保留在当前连接的控制台上显示它的实用程序。
使用以下方法轻松完成重定向:
using (FileStream fs = new FileStream(TestLogName("Texture"), FileMode.Create, FileAccess.Write)) {
Console.SetOut(new StreamWriter(fs));
...
Console.Out.Flush();
}
但是如何在已经连接的控制台上保存控制台输出时实现相同的结果(事实上复制流)?
答案 0 :(得分:3)
您可以使用写入文件的类和另一个TextWriter类对TextWriter进行子类化。然后使用System.Console.Out。
的当前值初始化此类的实例var writer = new SplitWriter(Console.Out, @"c:\temp\logfile.txt");
Console.SetOut(writer);
然后,SplitWriter负责写入文件和Console.Out的原始值。
答案 1 :(得分:1)
您可以将控制台和日志文件作为Trace侦听器附加,并使用Trace替换Console编写方法的所有用法:
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new DefaultTraceListener{LogFileName="C:\temp\myOutput.txt"});
...
Trace.Flush();
Trace.Listeners.Clear();
了解Trace不同于Console,无法读取,因此如果您使用Console.ReadLine并想要记录用户的输入,则需要将其“回显”回跟踪侦听器。
如果你想再多一点,你可以设置一个IOutputWriter接口,然后实现三个类;一个写入控制台,一个写入文件,另一个写入其他IOutputWriters集合,并将对其方法的任何调用路由到所有连接的IOutputWriters。这使用Composite和Adapter模式来规范化程序和监听程序之间的接口。这避免了内置的跟踪/调试功能,但是如果您已经将它用于不同级别的消息传递,或者您需要使消息的工作方式与Trace提供的默认消息有所不同,那么这就是替代方案。
答案 2 :(得分:0)
我认为你必须调用WinConI函数,如WriteConsoleOutput。我认为没有透视在多线程环境中转发所有其他写入。