2011-08-09 4 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インターフェイスを設定してから、3つのクラスを実装できます。コンソールに書き込むもの、ファイルに書き込むもの、そして他のIOutputWriterのコレクションを持つものと、そのメソッドへの呼び出しを、すべての接続されたIOutputWriterにルーティングするものです。これは、コンポジットとアダプターのパターンを使用して、プログラムとそれを聴いているものの間のインターフェースを標準化します。これは組み込みのトレース/デバッグ機能を回避しますが、既に別のレベルのメッセージングに使用している場合、またはTraceで提供されているデフォルトとは多少異なる動作をするメッセージングが必要な場合は、 。

0

あなたはWriteConsoleOutputのようなWinAPI関数を呼び出さなければならないと思います。私は、マルチスレッド環境での1回おきの書き込みをすべて転送するという視点は見ません。

関連する問題