Как записать в поток программы StdOut прямо в C #? - PullRequest
6 голосов
/ 27 февраля 2010

Я знаю, что для программы есть stdout / in / err, и я хочу перенаправить вывод программы в файл вместо вывода консоли. И теперь я разбираюсь с кодом ниже:

FileStream fs = File.Open(@"E:\console.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
TextWriter old = Console.Out;
Console.SetOut(sw);
Console.Write("bbb");
sw.Flush();

Но этот подход заключается в подключении программы stdout к Console.Out и перенаправлении Console.Out в файл. Это примерно так:

Program.StdOut -> Console.Out -> Файл

Консоль. Здесь, похоже, мост. Я не хочу этот мост, и я не хочу использовать Console.Write () , чтобы сделать вывод. Как можно сопоставить поток stdout программы с целевым файлом напрямую и записать в стандартный вывод программы вместо Console.Write () ? То, что я хочу, выглядит примерно так:

Program.StdOut -> Файл

Свойство Process.StandardOutput дает мне только для чтения StreamReader объект. Как написать в Process.StandardOutput ?? Или где стандартный вывод программы ?

Большое спасибо.

Ответы [ 3 ]

6 голосов
/ 27 февраля 2010

Вы можете получить стандартный вывод приложения, вызвав Console.OpenStandardOutput . Оттуда вы можете делать все что угодно с потоком, хотя вы не сможете переназначить его. Если вы хотите сделать это, вам придется P / Invoke SetStdHandle и обработать детали самостоятельно.

РЕДАКТИРОВАТЬ: Добавлен пример кода для маршрута P / Invoke:

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetStdHandle(int nStdHandle, IntPtr nHandle);

const int STD_OUTPUT_HANDLE = -11;

static void RedirectStandardOutput(FileStream file)
{
    SetStdHandle(STD_OUTPUT_HANDLE, file.SafeFileHandle.DangerousGetHandle());
}
6 голосов
/ 27 февраля 2010

Вы, вероятно, не должны устанавливать стандартный вывод вашего собственного процесса. Причина, по которой это стандартный вывод, заключается в том, что вызывающая сторона (командная строка, все, что угодно) может перенаправить ее туда, куда нужно, без необходимости знать вашу программу.

Вот как работают такие вещи, как «type foo.txt | more». Если команда type не стесняется переопределять стандартный вывод в файл, это не сработает вообще.

Если вы хотите записать в поток, просто откройте поток и запишите в него.

1 голос
/ 27 февраля 2010

используйте классы ProcessStartInfo и Process и установите для параметра RedirectStandardOutput значение true, после чего вы сможете захватывать выходные данные из потока.

ProcessStartInfo info = new ProcessStartInfo("process.exe", "-arg1 -arg2");
info.RedirectStandardOutput = true;
Process p = Process.Start(info);
p.Start();
string output = p.StandardOutput.ReadToEnd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...