Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Console.Out写入不同的输出文件_C#_Stdout - Fatal编程技术网

C# 将Console.Out写入不同的输出文件

C# 将Console.Out写入不同的输出文件,c#,stdout,C#,Stdout,我正在尝试使用Console.SetOut将Console.Out重定向到两个文本文件 Console.SetOut(File.CreateText("c:\\del1.txt")); Console.WriteLine(string1); ... Console.SetOut(File.CreateText("c:\\del2.txt")); Console.WriteLine(string2); 通过此重定向,创建了两个文本文件,其中没有任何数据。如果我注释掉第二个重定向,这就可以了。如何

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

Console.SetOut(File.CreateText("c:\\del1.txt"));
Console.WriteLine(string1);
...
Console.SetOut(File.CreateText("c:\\del2.txt"));
Console.WriteLine(string2);
通过此重定向,创建了两个文本文件,其中没有任何数据。如果我注释掉第二个重定向,这就可以了。如何使用
Console.SetOut
将输出重定向到不同的文件

Console.SetOut(File.CreateText("c:\\del1.txt"));
Console.WriteLine(string1);
...
Console.SetOut(File.CreateText("c:\\del2.txt"));
Console.WriteLine(string2);
Edit1:程序终止时没有任何错误,这能保证所有文件流都被关闭和刷新吗

编辑2: 感谢每一位回答我问题的人,我能够找到解决方案,而无需更改代码并添加两行额外的代码来关闭文件流。
Console.Out.Close()


有人能解释为什么程序终止后文件流不会关闭和刷新吗?

这是一个非常奇怪的场景-在我看来,您应该有两个不同的
文本编写器,并在需要时写入它们。别碰控制台。如果调用者想要通过管道传输stdout,让他们通过命令shell来解决这个问题

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

如果这意味着更改一些现有代码以传入
文本编写器
,那么这纯粹是一件好事。

设置System.IO.StreamWriter返回的每个System.IO.File.CreateTextAutoFlush属性,以true

编辑:修改后,您可以对不同的文件使用不同的字符串

    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");
        }
    }
您能不能编写一个包装器类来为您实现这一点

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

注:本代码未经测试,按原样编写,不包含任何保修条款:P

移动到跟踪功能,并将ConsoleTraceListener添加为侦听器之一。然后使用TextWriterTraceListener添加文本文件

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


更多的解释可以在这里找到。

正如Marc所指出的,您希望不同的字符串用于不同的文件。为什么不在每次通话中使用
File.AppendAllText

或者,您可以通过使用
构造来执行动态绑定之类的操作

更新:

一个简单的动态绑定:

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();
  }
}
用法(嵌套也适用):

这将打印到
控制台

Real 1
Real 2
它将附加到
Foo.txt

Moo
Bar
Ork
它将附加到
Bar.txt

Moo
Bar
Ork
有人能解释文件流的原因吗 之后未关闭和冲洗 程序终止

当资源最终被释放时,文件的句柄将最终被释放。通过显式地关闭文件句柄,您可以保证发布的时间(而不是保证发布的时间——如果您将发布留给框架,它最终会发生)


因此,请始终明确关闭文件句柄,这样您就可以知道您已在尽可能短的时间内绑定了一个文件。

请注意,OP正在将不同的字符串写入两个不同的文件,而不是将相同的字符串写入多个文件。对于我所需的内容,这将是一种过度操作。@Marc Gravell,修改为使用字典,并为每个文件命名标记,从而促进了这一点:为什么<代码>文件.AppendAllText
已执行此操作!请看我的答案上的便条。@leppie,谢谢你。我不知道
AppendAllText
!是的,我已经对不同的文件流进行了更改,但是知道为什么SetOut失败了吗?我不认为它失败了,你只是没有刷新文件流,所以你看不到文件中的任何内容。你是否按照建议将AutoFlush属性设置为true?@djeg如果程序在控制台写入后终止,它负责关闭溪流,对吗@由于我没有创建任何对象,因此无法设置AutoFlush属性。System.IO.File.CreateText创建该对象。只需将其放入变量(或字段或属性,如果以后需要再次使用),然后设置属性。很抱歉,我应该将问题编辑为,为什么不在关闭后刷新。非常好的文本文件写入解决方案:)。