同时在控制台和文件上写入文本
write text on console and file simultaneously
古腾标签!
问题是:我有一些代码可以通过 Console
class 在终端(命令行 window)上打印一些文本消息。我需要将此信息放在两个 'containers' - 终端和文本文件中。
有没有办法将输出流添加到 Console
class 以使其不仅在终端上输出数据?
如果我不需要过多更改现有代码,我会很高兴(有很多地方使用 Console.Write()
和 Console.WriteLine()
)。
不更改代码就无法完成。只需创建另一个 class,例如 "MyConsole" 并向其添加静态方法 "Write()" 和 "WriteLine()"。从您创建的方法内部调用 Console.Write()
和 Console.WriteLine()
方法。还可以调用将文本写入文件的方法。然后使用 MyConsole
class 而不是 Console
作为输出数据。 Visual Studio Find/Replace 功能将帮助您更改代码。
这不是一个完整的实现,但它应该足以让您开始您寻求的道路。
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。然后在右侧的解决方案资源管理器菜单中,单击 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();
}
}
}
这应该可以完成工作。我不知道您在控制台中的输出是什么样的,但是如果它不仅仅是一行,并且有多个 Console.Writelines 向控制台输出,那么您可以使用 while
和 if
,检查控制台的每一行,如果不是null
,就把它写出来。例如while (line != null)
后跟 if (line != null)
(假设您将 "line" 设置为等于控制台中的输出)
我无法使用 iamkrillin 的 post。
但以下确实有效:
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
}
}
古腾标签!
问题是:我有一些代码可以通过 Console
class 在终端(命令行 window)上打印一些文本消息。我需要将此信息放在两个 'containers' - 终端和文本文件中。
有没有办法将输出流添加到 Console
class 以使其不仅在终端上输出数据?
如果我不需要过多更改现有代码,我会很高兴(有很多地方使用 Console.Write()
和 Console.WriteLine()
)。
不更改代码就无法完成。只需创建另一个 class,例如 "MyConsole" 并向其添加静态方法 "Write()" 和 "WriteLine()"。从您创建的方法内部调用 Console.Write()
和 Console.WriteLine()
方法。还可以调用将文本写入文件的方法。然后使用 MyConsole
class 而不是 Console
作为输出数据。 Visual Studio Find/Replace 功能将帮助您更改代码。
这不是一个完整的实现,但它应该足以让您开始您寻求的道路。
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。然后在右侧的解决方案资源管理器菜单中,单击 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();
}
}
}
这应该可以完成工作。我不知道您在控制台中的输出是什么样的,但是如果它不仅仅是一行,并且有多个 Console.Writelines 向控制台输出,那么您可以使用 while
和 if
,检查控制台的每一行,如果不是null
,就把它写出来。例如while (line != null)
后跟 if (line != null)
(假设您将 "line" 设置为等于控制台中的输出)
我无法使用 iamkrillin 的 post。
但以下确实有效:
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
}
}