2011-08-09 66 views
3

我想將我的進程控制檯輸出重定向到文件,同時保留在最近連接的控制檯上顯示它的實用程序。重複自我處理的控制檯輸出

重定向與容易實現:

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

    ... 

    Console.Out.Flush(); 
} 

不過,雖然mantaining控制檯輸出已經連接控制檯(事實上的複製流)我如何能達到同樣的效果?

回答

2

您可以使用寫入文件和另一個TextWriter類的類對TextWriter進行子類別化。然後使用System.Console.Out的當前值初始化此類的一個實例。

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

然後SplitWriter負責寫入文件和Console.Out的原始值。

+0

更快的答案!我不知道爲什麼我沒有利用這個!謝謝。 – Luca

1

您可以將控制檯和一個日誌文件跟蹤監聽器,並與跟蹤取代的控制檯寫作方法的所有用途:

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

...  

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

明白了跟蹤,不像控制檯,無法讀取,因此,如果您曾經使用過Console.ReadLine並且想要記錄用戶的輸入,您需要將它「回顯」回到跟蹤監聽器。

如果你想多做一點SOLID,你可以設置一個IOutputWriter接口,然後實現三個類;一個寫入控制檯,一個寫入文件,另一個寫入其他IOutputWriters集合,並將其方法的任何調用路由到所有連接的IOutputWriters。這使用Composite和Adapter模式來規範你的程序和聽它的任何東西之間的接口。這避開了內置的跟蹤/調試功能,但是如果您已經將其用於不同級別的消息傳遞,或者您需要消息傳遞的工作方式與Trace提供的默認方式稍有不同,則該方法將轉爲交替。

0

我想你必須調用像WriteConsoleOutput這樣的WinAPI函數。我沒有看到在多線程環境中轉發所有其他寫入的觀點。