编写Console.Out到不同的输出文件

Roz*_*uur 3 c# stdout

我试图使用重定向Console.Out到两个文本文件Console.SetOut.

Console.SetOut(File.CreateText("c:\\del1.txt"));
Console.WriteLine(string1);
...
Console.SetOut(File.CreateText("c:\\del2.txt"));
Console.WriteLine(string2);
Run Code Online (Sandbox Code Playgroud)

通过此重定向,可以创建两个文本文件,而不包含任何数据.如果我注释掉第二个重定向,这工作正常.如何使用输出将输出重定向到不同的文件Console.SetOut.

Edit1:程序终止没有任何错误,这是否可以保证所有文件流都被关闭和刷新?

编辑2:感谢每一位回复了我的问题的人,我能够找到解决方案,不用更改代码并添加两行来关闭文件流. Console.Out.Close();

任何人都可以解释为什么程序终止后文件流没有关闭和刷新?

lep*_*pie 6

正如Marc指出的那样,你需要不同的字符串到不同的文件.为什么不File.AppendAllText用于每次通话?

另外,您可以通过使用using构造来执行类似动态绑定的操作.

更新:

一个简单的动态绑定:

class DynamicConsole : TextWriter
{
  readonly TextWriter orig;
  readonly TextWriter output;

  public DynamicConsole(string filename)
  {
     orig = Console.Out;
    output = File.AppendText(filename);
    Console.SetOut(output);
  }

  public override System.Text.Encoding Encoding
  {
    get { return output.Encoding; }
  }

  public override void Write(char value)
  {
    output.Write(value);
  }

  protected override void Dispose(bool disposing)
  {
    Console.SetOut(orig);
    output.Dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)

用法(嵌套也适用):

Console.WriteLine("Real 1");

using (new DynamicConsole("Foo.txt"))
{
  Console.WriteLine("Moo");

  using (new DynamicConsole("Bar.txt"))
  {
    Console.WriteLine("Ork");
  }

  Console.WriteLine("Bar");
}

Console.WriteLine("Real 2");
Run Code Online (Sandbox Code Playgroud)

这将打印到Console:

Real 1
Real 2
Run Code Online (Sandbox Code Playgroud)

它将附加到Foo.txt:

Moo
Bar
Run Code Online (Sandbox Code Playgroud)

它将附加到Bar.txt:

Ork
Run Code Online (Sandbox Code Playgroud)