さて、ここでのアイデアは、コンソールの入出力用のリーダー/ライターを以前と同じように変更するだけでなく、ログ ファイルにも書き出すことです。ファイル名/パスをパラメーターとして受け取るようにおそらく拡張する必要がある Log クラスを作成しましたが、出力ストリームを同期できるようにすることが重要でした。
public class Log
{
private StreamWriter output;
public Log()
{
output = new StreamWriter(File.OpenWrite("output.txt"));
}
public void Write(char c)
{
lock (output)
{
output.Write(c);
}
}
public void Close()
{
output.Close();
}
}
public class MyConsoleOutput : TextWriter
{
private TextWriter standard;
private Log log;
public MyConsoleOutput(TextWriter standard, Log log)
{
this.standard = standard;
this.log = log;
}
public override void Write(char value)
{
standard.Write(value);
log.Write(value);
}
public override Encoding Encoding
{
get { return Encoding.Default; }
}
protected override void Dispose(bool disposing)
{
standard.Dispose();
}
}
public class MyConsoleInput : TextReader
{
private TextReader standard;
private Log log;
public MyConsoleInput(TextReader standard, Log log)
{
this.standard = standard;
this.log = log;
}
public override int Peek()
{
return standard.Peek();
}
public override int Read()
{
int result = standard.Read();
log.Write((char)result);
return result;
}
protected override void Dispose(bool disposing)
{
standard.Dispose();
}
}
これらのクラスを作成したので、 の開始時に次のことを行いますMain
。
Log log = new Log();
Console.SetOut(new MyConsoleOutput(Console.Out, log));
Console.SetIn(new MyConsoleInput(Console.In, log));
の最後にもこれが必要ですMain
:
log.Close();
それはやや迅速で汚い書き込みです。これを本番環境で使用する場合、多くのクラス/メソッド名を変更したくなるでしょう。