从同一应用程序中的控制台获取所有行

时间:2013-11-06 14:09:06

标签: c#

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

似乎没有Console.ReadAllLines功能。

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

我在c#pls中如何做到这一点?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

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

可以这样做:

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);

答案 2 :(得分:1)

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

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

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

如果要发送邮件,请阅读AllLines。