在控制台和文件上同时写文本
Guten Tag! 问题是:我有一些代码在终端(命令行窗口)上通过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());
}
}
如果你运行这段代码,你会看到“你好”被打印到控制台和文件“Output.txt的”
如果不更改代码,则无法执行此操作。只需创建另一个类,例如“MyConsole”,并向其添加静态方法“Write()”和“WriteLine()”。从您创建的方法内部调用Console.Write()
和Console.WriteLine()
方法。也调用从您的方法向文件写入文本的方法。然后使用MyConsole
类而不是Console
作为输出数据。 Visual Studio查找/替换功能将帮助您更改代码。
您应该使用StreamWriter
。它需要最少的附加代码。 按照这个例子,它会工作。
您需要输入“using System.IO”才能使此代码正常工作。不要忘记写它。
“YourTextFile.txt”需要.txt。
为了在您的文本文件中看到结果,您需要转到计算机中的实际文件夹,然后从那里打开文本文件。 Visual Studio中的文本文件将显示为空。
(如c:/documents/visualstudio/projects/ConsoleApplication1/bin/debug/YourTextFile.txt)
解决方案 先在Visual Studio中的文本文件YourTextFile.txt 。然后在右侧的解决方案资源管理器菜单中,单击YourTextFile以查看解决方案资源管理器下的属性。将“复制到输出目录”属性从“不复制”更改为“复制始终”。 (这是绝对必须的)
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
和if
来检查每一行控制台,如果它不是null
写出来。例如while (line != null)
其次if (line != null)
(假设你设置“线”等于你的控制台的输出)
感谢您的答复,但我认为你还没有抓住这一点。看看iamkrillin的回答 –
@ user2123007啊,好的。那么你应该将自己的答案标记为问题的解决方案。否则,人们会认为答案不是你想要的。问候 –
这真的是我寻找 – aminvincent