如何将控制台窗口上的操作保存到文本文件中?

时间:2012-05-24 18:01:08

标签: c# visual-studio-2010

如果我们编译以下代码并运行生成的应用程序,我们将通过输入我们的名称,按Enter键并按任意键退出来与之交互。所有这些操作都在控制台窗口中完成。

using System;

namespace HelloWorld
{
    class Program
    {

        static void Main(string[] args)
        {
            Console.Write("Enter your name: ");
            var name = Console.ReadLine();
            Console.WriteLine("Your name is {0} ", name);
            Console.ReadKey();

        }
    }
}

是否可以将所有这些操作保存到文本文件中,以便我可以将其用作日志?

编辑:

我应该解释真实情况。我正在写一本关于C#的书。我想避免将控制台窗口的屏幕截图附加到书上,因为我想让书的文件大小尽可能小。相反,我想附加一个显示控制台窗口内容的文本文件到书中。添加额外的代码(用于创建文本文件)会使代码示例复杂化,这反过来会使读者感到困惑。

4 个答案:

答案 0 :(得分:2)

好的,所以这里的想法是更改控制台输入和输出的读取器/写入器以执行它们之前执行的操作,但也写出日志文件。我创建了一个Log类,它应该可以扩展,以便将文件名/路径作为参数,但重要的是要有一个以便输出流可以同步。

public class Log
{
    private StreamWriter output;
    public Log()
    {
        output = new StreamWriter(File.OpenWrite("output.txt"));

    }
    public void Write(char c)
    {
        lock (output)
        {
            output.Write(c);
        }
    }
    public void Close()
    {
        output.Close();
    }
}

public class MyConsoleOutput : TextWriter
{
    private TextWriter standard;
    private Log log;

    public MyConsoleOutput(TextWriter standard, Log log)
    {
        this.standard = standard;
        this.log = log;
    }

    public override void Write(char value)
    {
        standard.Write(value);
        log.Write(value);
    }

    public override Encoding Encoding
    {
        get { return Encoding.Default; }
    }

    protected override void Dispose(bool disposing)
    {
        standard.Dispose();
    }
}

public class MyConsoleInput : TextReader
{
    private TextReader standard;
    private Log log;
    public MyConsoleInput(TextReader standard, Log log)
    {
        this.standard = standard;
        this.log = log;
    }

    public override int Peek()
    {
        return standard.Peek();
    }


    public override int Read()
    {
        int result = standard.Read();
        log.Write((char)result);
        return result;
    }
    protected override void Dispose(bool disposing)
    {
        standard.Dispose();
    }
}

现在我们已经创建了这些类,我们将在Main开始时执行以下操作:

Log log = new Log();
Console.SetOut(new MyConsoleOutput(Console.Out, log));
Console.SetIn(new MyConsoleInput(Console.In, log));

我们还需要Main

的结尾
log.Close();

这是一个有点快速和肮脏的写作。如果你在生产中使用它,你可能想要改变很多类/方法名称。

答案 1 :(得分:1)

没有任何东西可以自动“遮蔽”你的控制台IO,所以你必须自己做。话虽这么说,打开一个文本文件并写下你想要的任何东西都相当容易。

在您的情况下,只需打开一个文本文件,并在写入控制台时将信息写入其中,并根据需要从控制台中读取。有关详细信息,请参阅MSDN的How to: Write To a Text File

答案 2 :(得分:1)

您可以使用StreamWriter输出您通过Console

捕获的内容
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\ProgramOutput.txt", true))
        {
            file.WriteLine(name);
        }  

答案 3 :(得分:0)

此示例可以帮助您:

Console.WriteLine("Hello World");
FileStream fs = new FileStream("Test.txt", FileMode.Create);
// First, save the standard output.
TextWriter tmp = Console.Out;
StreamWriter sw = new StreamWriter(fs);
Console.SetOut(sw);
Console.WriteLine("Hello file");
Console.SetOut(tmp);
Console.WriteLine("Hello World");
sw.Close();

了解详情: http://msdn.microsoft.com/ru-ru/library/system.console.setin.aspxhttp://msdn.microsoft.com/ru-ru/library/system.console.setout.aspxhttp://msdn.microsoft.com/en-us/library/system.console.in.aspxhttp://msdn.microsoft.com/ru-ru/library/system.console.out.aspx