4

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

重定向很容易完成:

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

    ...

    Console.Out.Flush();
}

但是,如何在已连接的控制台上维护控制台输出的同时获得相同的结果(事实上复制了流)?

4

3 回答 3

4

您可以使用写入文件的类和另一个 TextWriter 类对 TextWriter 进行子类化。然后用 System.Console.Out 的当前值初始化这个类的一个实例。

var writer = new SplitWriter(Console.Out, @"c:\temp\logfile.txt");
Console.SetOut(writer);

然后,SplitWriter 负责写入文件和 Console.Out 的原始值。

于 2011-08-09T16:07:34.120 回答
2

您可以将 Console 和日志文件附加为 Trace 侦听器,并将 Console 编写方法的所有用法替换为 Trace:

Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new DefaultTraceListener{LogFileName="C:\temp\myOutput.txt"});

...       

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

了解 Trace 与 Console 不同,无法从中读取,因此如果您曾经使用 Console.ReadLine 并想要记录用户的输入,则需要将其“回显”回跟踪侦听器。

如果你想更 SOLID,你可以设置一个 IOutputWriter 接口,然后实现三个类;一个写入控制台,一个写入文件,第三个具有其他 IOutputWriter 的集合,并将对其方法的任何调用路由到所有附加的 IOutputWriter。这使用 Composite 和 Adapter 模式来规范你的程序和任何监听它的东西之间的接口。这回避了内置的 Trace/Debug 功能,但是如果您已经将其用于不同级别的消息传递,或者您需要消息传递的工作方式与 Trace 提供的默认值稍有不同,那么这是替代方案.

于 2011-08-09T16:06:19.193 回答
0

我认为您必须调用诸如 WriteConsoleOutput 之类的 WinAPI 函数。我看不到在多线程环境中转发所有其他写入的观点。

于 2011-08-09T16:11:45.820 回答