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

时间:2011-02-02 10:36:56

标签: c# stdout

我尝试使用Console.OutConsole.SetOut重定向到两个文本文件。

Console.SetOut(File.CreateText("c:\\del1.txt"));
Console.WriteLine(string1);
...
Console.SetOut(File.CreateText("c:\\del2.txt"));
Console.WriteLine(string2);

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

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

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

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

7 个答案:

答案 0 :(得分:5)

正如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();
  }
}

用法(嵌套也可以):

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");

这将打印到Console

Real 1
Real 2

它将附加到Foo.txt

Moo
Bar

它将附加到Bar.txt

Ork

答案 1 :(得分:2)

这是一个非常离奇的场景 - IMO你应该有两个不同的TextWriter,并在需要时写入他们。让控制台独自一人。如果调用者想要管道stdout,让他们通过命令shell来担心。

using(var file = File.CreateText(@"c:\del1.txt")) {
    file.WriteLine(string1);
}
using(var file = File.CreateText(@"c:\del2.txt")) {
    file.WriteLine(string2);
}

如果这意味着更改某些现有代码以传递TextWriter,那么这绝对是一件好事。

答案 2 :(得分:2)

    using (TextWriter file1 = File.CreateText("c:\\del1.txt")) {
        using (TextWriter file2 = File.CreateText("c:\\del2.txt")) {
            Console.SetOut(file1);
            Console.WriteLine("test1");
            Console.SetOut(file2);
            Console.WriteLine("test2");
        }
    }

答案 3 :(得分:2)

System.IO.File.CreateText 返回的 System.IO.StreamWriter AutoFlush 属性设置为 true

答案 4 :(得分:2)

转到“跟踪”功能,并将ConsoleTraceListener添加为其中一个侦听器。然后使用TextWriterTraceListener添加文本文件。

使用跟踪开关重定向到一个或另一个侦听器。

可以在http://msdn.microsoft.com/en-us/library/system.diagnostics.traceswitch.aspx找到更多解释。

答案 5 :(得分:1)

编辑:已修改,以便您可以对不同的文件执行不同的字符串..

你能写一个为你做这个的包装类吗?

public class MyConsole
{
    //private List<IO.StreamWriter> m_Outputs = new List<IO.StreamWriter>();
    private Dictionary<String, IO.StreamWriter> m_Outputs = new Dictionary<String, IO.StreamWriter>();

    public MyConsole() { }
    public MyConsole(string _token, string _file)
    {
        AddOutput(_token, _file);
    }

    public void AddOutput(string _token, string _file)
    {
        IO.StreamWriter writer = new IO.StreamWriter(_file)
        m_Outputs[_token] = writer;
    }

    public void WriteLine(string _token, string _data)
    {
        if(m_Outputs.ContainsKey(_token))
            m_Outputs[_token].WriteLine(_data);
    }


    public void Close()
    {
        foreach(KeyValuePair<String, IO.StreamWriter> pair in m_Outputs)
            pair.Value.Close();
    }
} // eo class MyConsole

用法:

MyConsole c = new MyConsole();  // or pass a file explicitly here
c.AddOutput("file1", "C:\\file1.txt");
c.AddOutput("file2", "C:\\file2.txt");
c.WriteLine("file1", "Test!");
c.WriteLine("file2", "Test2!");

请注意,此代码未经过测试,按原样编写,不提供任何保证。 :P

答案 6 :(得分:1)

  

任何人都可以解释文件流的原因   之后没有关闭和冲洗   程序终止了?

最终处理资源时,文件的句柄最终会被释放。通过显式关闭文件句柄,您可以保证在发布时发生(而不是保证发布版本 - 如果您将其留给框架,最终会发生这种情况。)

因此,请务必明确关闭文件句柄,以便知道您在最短的时间内绑定了文件。