我尝试使用Console.Out
将Console.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();
任何人都可以解释为什么文件流在程序终止后没有关闭和刷新?
答案 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)
任何人都可以解释文件流的原因 之后没有关闭和冲洗 程序终止了?
最终处理资源时,文件的句柄最终会被释放。通过显式关闭文件句柄,您可以保证在发布时发生(而不是保证发布版本 - 如果您将其留给框架,最终会发生这种情况。)
因此,请务必明确关闭文件句柄,以便知道您在最短的时间内绑定了文件。