同时在控制台和文件上写入文本
本文关键字:文本 文件 控制台 | 更新日期: 2023-09-27 18:14:23
标签!问题是:我有一些代码,通过终端(命令行窗口)上的Console
类打印一些文本消息。我需要这个信息被放置在两个"容器"-终端和文本文件。是否有一种方法可以将输出流添加到Console
类,以使其不仅在终端上输出数据?如果我不需要太多地改变现有的代码(有很多地方使用Console.Write()
和Console.WriteLine()
),那就太好了。
这不是一个完整的实现,但它应该足以让您开始寻找路径。
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"
不修改代码是做不到的。只需创建另一个类,例如"MyConsole",并为其添加静态方法"Write()"answers"WriteLine()"。从创建的方法内部调用Console.Write()
和Console.WriteLine()
方法。还可以调用从方法向文件写入文本的方法。然后使用MyConsole
类而不是Console
来输出数据。Visual Studio查找/替换功能将帮助您更改代码
您应该使用StreamWriter
。它需要最少的额外代码。遵循这个例子,它将工作。
你需要输入"using System"。为了使这段代码工作。别忘了写
"YourTextFile.txt"需要。txt.
为了在文本文件中看到结果,您需要进入计算机中的实际文件夹,并从那里打开文本文件。Visual Studio中的文本文件将显示为空。
(例如:c:/documents/visualstudio/projects/ConsoleApplication1/bin/debug/YourTextFile.txt)
<
解决方案/strong>首先在Visual Studio中创建一个文本文件YourTextFile.txt。然后在右侧的解决方案资源管理器菜单中,单击YourTextFile以查看解决方案资源管理器下面的属性。将属性"Copy to Output Directory"从"Do Not Copy"更改为"Copy Always"。(这是绝对必须的)
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();
}
}
}
这个应该可以了。我不知道控制台的输出是什么样子,但如果不是一行,而且有多个控制台。将输出写入到控制台,然后您可以使用while
和if
来检查控制台的每一行,如果不是null
,则将其写出来。例如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
}
}