C# 同时在控制台和文件上写入文本
古滕标签! 问题是:我有一些代码,可以通过终端(命令行窗口)上的C# 同时在控制台和文件上写入文本,c#,logging,stream,console,C#,Logging,Stream,Console,古滕标签! 问题是:我有一些代码,可以通过终端(命令行窗口)上的控制台类打印一些文本消息。我需要将这些信息放在两个“容器”中-终端和文本文件。 是否有一种方法可以将输出流添加到控制台类中,以使其不仅在终端上输出数据? 如果我不需要太多地更改现有代码(在很多地方都使用了Console.Write()和Console.WriteLine()),那就太糟糕了。如果不更改代码,你就做不到。只需创建另一个类,例如“MyConsole”,并向其中添加静态方法“Write()”和“WriteLine()”。从
控制台类打印一些文本消息。我需要将这些信息放在两个“容器”中-终端和文本文件。
是否有一种方法可以将输出流添加到控制台
类中,以使其不仅在终端上输出数据?
如果我不需要太多地更改现有代码(在很多地方都使用了Console.Write()
和Console.WriteLine()
),那就太糟糕了。如果不更改代码,你就做不到。只需创建另一个类,例如“MyConsole”,并向其中添加静态方法“Write()”和“WriteLine()”。从您创建的方法内部调用Console.Write()
和Console.WriteLine()
方法。还调用从方法将文本写入文件的方法。然后使用您的MyConsole
类而不是Console
获取输出数据。Visual Studio查找/替换功能将帮助您更改代码。这不是一个完整的实现,但它应该足以让您沿着所寻求的路径开始
class Program
{
static void Main(string[] args)
{
DualOut.Init();
Console.WriteLine("Hello");
Console.ReadLine();
}
}
public static class DualOut
{
private static TextWriter _current;
private class OutputWriter : TextWriter
{
public override Encoding Encoding
{
get
{
return _current.Encoding;
}
}
public override void WriteLine(string value)
{
_current.WriteLine(value);
File.WriteAllLines("Output.txt", new string[] { value });
}
}
public static void Init()
{
_current = Console.Out;
Console.SetOut(new OutputWriter());
}
}
如果运行此代码,您将看到“Hello”同时打印到控制台和文件“Output.txt”您应该使用StreamWriter
。它需要最少的额外代码。
按照这个例子,它会起作用
- 您需要键入“using System.IO”才能使此代码正常工作。别忘了写
- “YourTextFile.txt”需要.txt
- 为了在文本文件中查看结果,您需要转到计算机中的实际文件夹,然后从那里打开文本文件。Visual Studio中的文本文件将显示为空
(例如c:/documents/visualstudio/projects/ConsoleApplication1/bin/debug/YourTextFile.txt)
解决方案
首先在Visual Studio中创建文本文件YourTextFile.txt。然后在右侧的解决方案资源管理器菜单中,单击文本文件以查看解决方案资源管理器下面的属性。将属性“复制到输出目录”从“不复制”更改为“始终复制”。(这是绝对必须的)
这应该可以完成任务。我不知道您在控制台中的输出是什么样子的,但是如果它不是一行,并且有多个控制台。向控制台提供输出的writeline,那么您可以使用while
和if
,检查控制台的每一行,如果它不是null
,则将其写出。e、 g.while(line!=null)
后跟if(line!=null)
(假设您将“line”设置为与控制台中的输出相等)我无法让iamkrillin的帖子工作
但以下方法确实有效:
class Program
{
static void Main(string[] args)
{
ConsoleFileOutput cf = new ConsoleFileOutput("Output.txt", Console.Out);
Console.SetOut(cf);
Console.WriteLine("0ne");
Console.WriteLine("two");
Console.WriteLine("three");
cf.Close();
}
public class ConsoleFileOutput : TextWriter
{
#region Fields
private Encoding encoding = Encoding.UTF8;
private StreamWriter writer;
private TextWriter console;
#endregion
#region Properties
public override Encoding Encoding
{
get
{
return encoding;
}
}
#endregion
#region Constructors
public ConsoleFileOutput(string filePath, TextWriter console, Encoding encoding = null)
{
if (encoding != null)
{
this.encoding = encoding;
}
this.console = console;
this.writer = new StreamWriter(filePath, false, this.encoding);
this.writer.AutoFlush = true;
}
#endregion
#region Overrides
public override void Write(string value)
{
Console.SetOut(console);
Console.Write(value);
Console.SetOut(this);
this.writer.Write(value);
}
public override void WriteLine(string value)
{
Console.SetOut(console);
Console.WriteLine(value);
this.writer.WriteLine(value);
Console.SetOut(this);
}
public override void Flush()
{
this.writer.Flush();
}
public override void Close()
{
this.writer.Close();
}
#endregion
#region IDisposable
new public void Dispose()
{
this.writer.Flush();
this.writer.Close();
this.writer.Dispose();
base.Dispose();
}
#endregion
}
}
谢谢你的答复,但我认为你没有抓住重点。看一看iamkrillin的answer@user2123007啊,好的。那么你应该把他的答案标记为你问题的解决办法。否则人们会认为答案不是你想要的。这才是我真正想要的
class Program
{
static void Main(string[] args)
{
ConsoleFileOutput cf = new ConsoleFileOutput("Output.txt", Console.Out);
Console.SetOut(cf);
Console.WriteLine("0ne");
Console.WriteLine("two");
Console.WriteLine("three");
cf.Close();
}
public class ConsoleFileOutput : TextWriter
{
#region Fields
private Encoding encoding = Encoding.UTF8;
private StreamWriter writer;
private TextWriter console;
#endregion
#region Properties
public override Encoding Encoding
{
get
{
return encoding;
}
}
#endregion
#region Constructors
public ConsoleFileOutput(string filePath, TextWriter console, Encoding encoding = null)
{
if (encoding != null)
{
this.encoding = encoding;
}
this.console = console;
this.writer = new StreamWriter(filePath, false, this.encoding);
this.writer.AutoFlush = true;
}
#endregion
#region Overrides
public override void Write(string value)
{
Console.SetOut(console);
Console.Write(value);
Console.SetOut(this);
this.writer.Write(value);
}
public override void WriteLine(string value)
{
Console.SetOut(console);
Console.WriteLine(value);
this.writer.WriteLine(value);
Console.SetOut(this);
}
public override void Flush()
{
this.writer.Flush();
}
public override void Close()
{
this.writer.Close();
}
#endregion
#region IDisposable
new public void Dispose()
{
this.writer.Flush();
this.writer.Close();
this.writer.Dispose();
base.Dispose();
}
#endregion
}
}