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

时间:2011-08-09 15:42:24

标签: c# console io-redirection

我想将我的进程控制台输出重定向到文件,同时保留在当前连接的控制台上显示它的实用程序。

使用以下方法轻松完成重定向:

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

    ...

    Console.Out.Flush();
}

但是如何在已经连接的控制台上保存控制台输出时实现相同的结果(事实上复制流)?

3 个答案:

答案 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。我认为没有透视在多线程环境中转发所有其他写入。