Как записать в Поток StdOut программы непосредственно в C#?

Я знаю, что существуют 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 программы к Консоли. И перенаправление Консоль. В файл. Это отчасти похоже на это:

Программа. StdOut-> Консоль.-> Файл

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

Программа. StdOut-> Файл

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

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

6
задан smwikipedia 27 February 2010 в 04:44
поделиться

3 ответа

Вы можете получить стандартный вывод приложения, вызвав 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
ответ дан 8 December 2019 в 18:35
поделиться

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

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

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

6
ответ дан 8 December 2019 в 18:35
поделиться

используйте классы 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();
1
ответ дан 8 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: