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.CreateText的AutoFlush属性,以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创建该对象。只需将其放入变量(或字段或属性,如果以后需要再次使用),然后设置属性。很抱歉,我应该将问题编辑为,为什么不在关闭后刷新。非常好的文本文件写入解决方案:)。