Console Capture Override Using LINQPad - adamzuckerman/first-timer GitHub Wiki
This is some test code I wrote to see if I could capture the Console
output so that it could be logged to a file as well as being displayed on the console window.
private System.IO.TextWriter origConsoleOut = Console.Out;
void Main()
{
using (var consoleWriter = new ConsoleWriter())
{
consoleWriter.WriteEvent += consoleWriter_WriteEvent;
consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent;
Console.SetOut(consoleWriter);
Console.WriteLine("This should be buffered.");
Console.SetOut(origConsoleOut);
Console.WriteLine("This should be unbuffered.");
Console.SetOut(consoleWriter);
Console.WriteLine("This should also be buffered.");
Console.SetOut(origConsoleOut);
Console.WriteLine();
Console.WriteLine("This should also be unbuffered.");
consoleWriter.Log.Dump();
}
}
// Define other methods and classes here
static void consoleWriter_WriteLineEvent(object sender, ConsoleWriterEventArgs e)
{
// Do something with the data sent by the event
}
static void consoleWriter_WriteEvent(object sender, ConsoleWriterEventArgs e)
{
// Do something with the data sent by the event
}
public class ConsoleWriterEventArgs : EventArgs
{
public string Value { get; private set; }
public ConsoleWriterEventArgs(string value)
{
Value = value;
}
}
public class ConsoleWriter : TextWriter
{
private StringBuilder log;
public ConsoleWriter() : base()
{
log = new StringBuilder();
}
public override Encoding Encoding { get { return Encoding.UTF8; } }
public string Log { get { return log.ToString(); } }
public override void Write(string value)
{
if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value));
log.Append(value);
base.Write(value);
}
public override void WriteLine(string value)
{
if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value));
log.AppendLine(value);
base.WriteLine(value);
}
public event EventHandler<ConsoleWriterEventArgs> WriteEvent;
public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent;
}