Дублированный вывод на консоль собственного процесса - PullRequest
3 голосов
/ 09 августа 2011

Я бы хотел перенаправить вывод своей консоли процесса в файл, сохраняя при этом утилиту ее отображения на текущей консоли.

Перенаправление выполняется легко с помощью:

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

    ...

    Console.Out.Flush();
}

Но как я могу достичь того же результата, управляя выводом консоли на уже подключенной консоли (де-факто дублируя поток)?

Ответы [ 3 ]

3 голосов
/ 09 августа 2011

Вы можете подкласс TextWriter с классом, который записывает в файл и другой класс TextWriter. Затем инициализируйте экземпляр этого класса с текущим значением System.Console.Out.

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

SplitWriter затем берет на себя ответственность за запись как в файл, так и в исходное значение Console.Out.

1 голос
/ 09 августа 2011

Вы можете присоединить консоль и файл журнала в качестве прослушивателей Trace и заменить все способы записи консоли на Trace:

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

...       

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

Понимать, что Trace, в отличие от консоли, не может быть прочитана, поэтому еслиВы когда-либо используете Console.ReadLine и хотите записать ввод пользователя, вам нужно «передать» его обратно слушателям трассировки.

Если вы хотите использовать немного больше SOLID, вы можете настроитьIOutputWriter интерфейс, затем реализовать три класса;тот, который пишет в консоль, тот, который пишет в файл, и третий, который имеет коллекцию других IOutputWriters и направляет любой вызов его методов всем подключенным IOutputWriters.При этом используются шаблоны Composite и Adapter для нормализации интерфейса между вашей программой и всем, что ее слушает.Это обходит встроенную функциональность Trace / Debug, но если вы уже используете это для другого уровня обмена сообщениями, или вам нужно, чтобы ваш обмен сообщениями работал немного иначе, чем по умолчанию, предоставляемый Trace, то это альтернативный переход.

0 голосов
/ 09 августа 2011

Я думаю, вам придется вызывать функции WinAPI, такие как WriteConsoleOutput. Я не вижу перспективы пересылки любой другой записи в многопоточной среде.

...