2

我有一个将各种状态更新和时间写入控制台的应用程序。我还有一个电子邮件功能,可以向客户发送电子邮件。我想在应用程序结束时发送一封电子邮件,其中包含来自控制台的所有行(相同的应用程序)。

似乎没有函数 Console.ReadAllLines。

我看到了一些关于 GetStdHandle 的想法,但可以让它发挥作用。

有什么想法我可以在 c# 中做到这一点吗?

4

3 回答 3

4

您可以通过实现自己的TextWriterConsole.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();
于 2013-11-06T14:24:47.653 回答
2

读回已经输出到控制台的信息是一种向后的设计。相反,将信息存储在数据库/文件/内存中,以便可以重复使用。继续像你一样显示输出。但是,当您需要发送电子邮件时,请从数据库/文件/内存中挖掘信息。

可以这样做:

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);
于 2013-11-06T14:11:26.023 回答
1

您可以编写一个包装类来轻松处理它。

public class ConsoleWriter()
{
    public static List<string> AllLines = new List<string>();

    public static WriteConsole(string text)
    {
        AllLines.Add(text);
        Console.Write(text);
    }
}

然后在您要发送邮件时阅读 AllLines。

于 2013-11-06T14:13:31.353 回答