// -------------------------------------------------- // UnityInjector - ConsoleMirror.cs // Copyright (c) Usagirei 2015 - 2015 // -------------------------------------------------- using System; using System.Diagnostics; using System.IO; using System.Text; namespace UnityInjector.ConsoleUtil { internal class ConsoleMirror : IDisposable { private readonly MirrorWriter _tWriter; public ConsoleMirror(string path) { try { var fileStream = File.Open(path, FileMode.Append, FileAccess.Write, FileShare.Read); var fileWriter = new StreamWriter(fileStream) { AutoFlush = true }; _tWriter = new MirrorWriter(fileWriter, Console.Out); } catch (Exception e) { SafeConsole.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("Couldn't open file to write: {0}", Path.GetFileName(path)); Console.WriteLine(e.Message); SafeConsole.ForegroundColor = ConsoleColor.Gray; return; } Console.SetOut(_tWriter); Console.WriteLine(); var processName = Process.GetCurrentProcess().ProcessName; var now = DateTime.Now; Console.WriteLine($" {processName} - {now:dd-MM-yyyy hh:mm:ss} ".PadCenter(79, '=')); Console.WriteLine(); } public void Dispose() { var cOld = _tWriter.Console; var fOld = _tWriter.File; Console.SetOut(cOld); if (fOld == null) return; fOld.Flush(); fOld.Close(); } private class MirrorWriter : TextWriter { public TextWriter Console { get; } public override Encoding Encoding => File.Encoding; public TextWriter File { get; } public MirrorWriter(TextWriter file, TextWriter console) { File = file; Console = console; } public override void Flush() { File.Flush(); Console.Flush(); } public override void Write(char value) { File.Write(value); Console.Write(value); } } } }