Guten Tag!
问题是:我有一些代码在终端(命令行窗口)上通过Console
类打印一些文本消息。我需要将这些信息放在两个容器中。 - 终端和文本文件。
有没有办法将输出流添加到Console
类,以使其不仅在终端上输出数据?
如果我不需要过多地更改现有代码(有许多地方使用Console.Write()
和Console.WriteLine()
),我们会感激不尽。
答案 0 :(得分:8)
这不是一个完整的实现,但它应该足以让你开始沿着你寻求的道路前进。
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”
答案 1 :(得分:0)
如果不更改代码,则无法执行此操作。只需创建另一个类,例如“MyConsole”,并向其添加静态方法“Write()”和“WriteLine()”。从您创建的方法内部调用Console.Write()
和Console.WriteLine()
方法。还可以调用从方法中将文本写入文件的方法。然后使用MyConsole
类而不是Console
来输出数据。 Visual Studio查找/替换功能将帮助您更改代码。
答案 2 :(得分:0)
您应该使用StreamWriter
。它需要最少的额外代码。
按照这个例子,它会起作用。
你需要输入"使用System.IO"为了使这段代码有效。别忘了写它。
" YourTextFile.txt"需要.txt。
要在文本文件中查看结果,您需要转到计算机中的实际文件夹,然后从那里打开文本文件。 Visual Studio中的文本文件将显示为空。
(例如c:/documents/visualstudio/projects/ConsoleApplication1/bin/debug/YourTextFile.txt)
<强>解决方案强> 首先在Visual Studio中创建文本文件YourTextFile.txt。然后在右侧的Solution Explorer菜单中,单击YourTextFile以查看Solution Explorer下面的Properties。更改属性&#34;复制到输出目录&#34;来自&#34;不要复制&#34;到&#34; 始终复制&#34;。 (这是绝对必须的)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Answer
{
static void Main(string[] args)
{
string text = "This text will appear on your console and be saved in the txt file";
Console.WriteLine(text);
StreamWriter saveText = new StreamWriter("YourTextFile.txt");
saveText.WriteLine(text);
saveText.Close();
Console.ReadLine();
}
}
}
这应该可以胜任。我不知道控制台中的输出是什么样的,但如果它不只是一行,并且有多个Console.Writelines将输出提供给控制台,那么您可以使用while
和{{ 1}},检查控制台的每一行以及它是否if
写出来。例如null
后跟while (line != null)
(假设您设置&#34;行&#34;等于控制台中的输出)
答案 3 :(得分:0)
我无法获得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
}
}