如何直接在C#中写入程序的StdOut Stream?

时间:2010-02-27 04:37:25

标签: c# operating-system

我知道程序中存在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.Out这里似乎是一座桥梁。我不想要这个桥,我不想使用 Console.Write()来输出。如何将程序的stdout流映射到目标文件 直接 并直接写入程序的stdout而不是 Console.Write()?我想要的是这样的:

  

Program.StdOut - >文件

Process.StandardOutput 属性只为我提供了一个只读 StreamReader 对象。如何写入Process.StandardOutput?或者程序的标准输出在哪里?

非常感谢。

3 个答案:

答案 0 :(得分:6)

您可以通过调用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());
}

答案 1 :(得分:6)

您可能不应设置自己进程的标准输出。它是stdout的原因是调用者(命令行,无论如何)可以在任何需要的地方重定向它,而不需要程序知道。

这就是“输入foo.txt | more”之类的工作方式。如果type命令可以自由地将stdout重新定义为文件,那么根本不起作用。

如果要写入流,只需打开流并写入即可。

答案 2 :(得分:1)

使用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();