我有一个将各种状态更新和时间写入控制台的应用程序。我还有一个电子邮件功能,可以向客户发送电子邮件。我想在应用程序结束时发送一封电子邮件,其中包含来自控制台的所有行(相同的应用程序)。
似乎没有函数 Console.ReadAllLines。
我看到了一些关于 GetStdHandle 的想法,但可以让它发挥作用。
有什么想法我可以在 c# 中做到这一点吗?
我有一个将各种状态更新和时间写入控制台的应用程序。我还有一个电子邮件功能,可以向客户发送电子邮件。我想在应用程序结束时发送一封电子邮件,其中包含来自控制台的所有行(相同的应用程序)。
似乎没有函数 Console.ReadAllLines。
我看到了一些关于 GetStdHandle 的想法,但可以让它发挥作用。
有什么想法我可以在 c# 中做到这一点吗?
您可以通过实现自己的TextWriter
和Console.SetOut
public class MyWriter : TextWriter
{
private List<string> lines = new List<string>();
private TextWriter original;
public MyWriter(TextWriter original)
{
this.original = original;
}
public override Encoding Encoding
{
get { return Encoding.Default; }
}
public override void WriteLine(string value)
{
lines.Add(value);
original.WriteLine(value);
}
//You need to override other methods also
public string[] GetLines()
{
return lines.ToArray();
}
}
并像这样使用它
var writer = new MyWriter(Console.Out);
Console.SetOut(writer);
Console.WriteLine("Hello world");
Console.WriteLine("Bye!");
var lines = writer.GetLines();
读回已经输出到控制台的信息是一种向后的设计。相反,将信息存储在数据库/文件/内存中,以便可以重复使用。继续像你一样显示输出。但是,当您需要发送电子邮件时,请从数据库/文件/内存中挖掘信息。
可以这样做:
List<string> outputList = new List<string>();
string output = GetOutput();//Run continuously...perhaps in a loop or event trigger..whatever applies
outputList.Add(output);
Console.Writeline(output);
//when ready
SendEmail(outputList);
您可以编写一个包装类来轻松处理它。
public class ConsoleWriter()
{
public static List<string> AllLines = new List<string>();
public static WriteConsole(string text)
{
AllLines.Add(text);
Console.Write(text);
}
}
然后在您要发送邮件时阅读 AllLines。