Я знаю, что существуют 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 программы?
Большое спасибо.
Вы можете получить стандартный вывод приложения, вызвав 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());
}
Вероятно, вам не следует устанавливать стандартный вывод вашего собственного процесса. Причина, по которой это stdout, заключается в том, что вызывающий (командная строка, что угодно) может перенаправить его туда, куда ему нужно, без необходимости знать вашей программе.
Вот как работают такие вещи, как «type foo.txt | more». Если бы команда type могла свободно переопределить stdout для файла, это вообще не сработало бы.
Если вы хотите писать в поток, просто откройте поток и напишите в него.
используйте классы 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();