c# - 如何将我们在控制台窗口上的操作保存到文本文件中?

标签 c# visual-studio-2010

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

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# 的书。我想避免将控制台窗口的屏幕截图附加到书中,因为我想让我的书的文件大小尽可能小。相反,我想将显示控制台窗口内容的文本文件附加到书中。添加额外的代码(用于创建文本文件)会使代码示例复杂化,这反过来会使读者感到困惑。

最佳答案

好的,所以这里的想法是更改控制台输入和输出的读取器/写入器以执行它们之前所做的操作,但也写入日志文件。我创建了一个 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();

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

关于c# - 如何将我们在控制台窗口上的操作保存到文本文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10742884/

相关文章:

c# - 使用 Odata 服务并获取 JSON 格式的结果

c# - 读取压缩文件并写入新文件将不允许解压

C# 从文本文件中的公钥获取 CngKey 对象

visual-studio-2010 - 在 Visual Studio 的安装文件中添加另一个 exe 文件

visual-studio - 某些VS选项卡在选中时保持不粘状态

visual-studio-2010 - 我的 Visual Studio 2012 中的行号旁边出现了彩色条

c++ - 我在处理我创建的这个对象时遇到错误

visual-studio-2010 - RDLC - 在 VS2010 中添加数据源

c# - Code First 类型 '' 上的属性 '' 上的ForeignKeyAttribute 无效。 Entity Framework

c# - NPOI Mapper可以设置行号吗