Writing Console.Out for Different Output Files

I am trying to redirect Console.Outto two text files using Console.SetOut.

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

With this redirection, two text files are created without any data. This works fine if I comment on the second redirect. How can I redirect output to different files using Console.SetOut.

Edit1: the program ends without any errors, does it guarantee that all file streams will be closed and reset?

Edit2: Thanks to everyone who answered my question, I was able to find a solution without changing the code and add two additional lines to close the file stream.           Console.Out.Close();

Can anyone explain why the file streams are not closed and not cleaned after the program terminates?

+3
source share
7

- IMO, TextWriter , . . stdout, .

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

- , TextWriter, .

+2

, . 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
+5
    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");
        }
    }
+2

AutoFlush System.IO.StreamWriter, System.IO.File.CreateText true. strong > .

+2

ConsoleTraceListener . , TextWriterTraceListener.

.

http://msdn.microsoft.com/en-us/library/system.diagnostics.traceswitch.aspx.

+2

EDIT: , .

-, ?

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

+1

- , ?

, . , , ( , , , , ).

, , .

+1

Source: https://habr.com/ru/post/1789461/