繁体   English   中英

在 c# 控制台应用程序和控制台输出中记录用户输入

[英]Log user input in a c# console application as well as console out

我目前正试图弄清楚,记录用户输入以及控制台生成的 output 的最佳方式是什么。 我目前的方法是使用:

class ConsoleCopy : IDisposable
    {

        FileStream fileStream;
        StreamWriter fileWriter;
        TextWriter doubleWriter;
        TextWriter oldOut;

        class DoubleWriter : TextWriter
        {

            TextWriter one;
            TextWriter two;

            public DoubleWriter(TextWriter one, TextWriter two)
            {
                this.one = one;
                this.two = two;
            }

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

            public override void Flush()
            {
                one.Flush();
                two.Flush();
            }

            public override void Write(char value)
            {
                one.Write(value);
                two.Write(value);
            }

        }

        public ConsoleCopy(string path)
        {
            oldOut = Console.Out;

            try
            {
                fileStream = File.Create(path);

                fileWriter = new StreamWriter(fileStream);
                fileWriter.AutoFlush = true;

                doubleWriter = new DoubleWriter(fileWriter, oldOut);
            }
            catch (Exception e)
            {
                Console.WriteLine("Cannot open file for writing");
                Console.WriteLine(e.Message);
                return;
            }
            Console.SetOut(doubleWriter);
        }

        public void Dispose()
        {
            Console.SetOut(oldOut);
            if (fileWriter != null)
            {
                fileWriter.Flush();
                fileWriter.Close();
                fileWriter = null;
            }
            if (fileStream != null)
            {
                fileStream.Close();
                fileStream = null;
            }
        }

    }

using (var cc = new ConsoleCopy(log))
{
    //some code
    Conole.WriteLine(string);
    Console.WriteLine(string2);
    string input = Console.ReadLine();

}

这种方法适用于控制台 output,但我仍然不知道如何添加用户输入。 我将控制台 output 重定向到该文件,同时也能够在控制台中看到它。 这也是我想通过 uesr 输入实现的目标。

非常感谢!

实际上,同样的方式。

请注意,此 class 目前仅实现 ReadLine():

class LoggingReader : TextReader
{
    TextReader old;
    TextWriter log;

    public LoggingReader(TextReader old, TextWriter log)
    {
        this.old = old;
        this.log = log;
    }

    public override string ReadLine()
    {
        string input = old.ReadLine();
        log.Write("> {0}\r\n", input);
        return input;
    }
}

这些作为成员添加到 ConsoleCopy:

TextReader oldIn;
TextReader loggingReader;

这是新的 ConsoleCopy 构造函数:

public ConsoleCopy(string path)
{
    oldOut = Console.Out;
    oldIn = Console.In; // ADDED

    try
    {
        fileStream = File.Create(path);

        fileWriter = new StreamWriter(fileStream);
        fileWriter.AutoFlush = true;

        doubleWriter = new DoubleWriter(fileWriter, oldOut);
        loggingReader = new LoggingReader(oldIn, fileWriter); // ADDED
    }
    catch (Exception e)
    {
        Console.WriteLine("Cannot open file for writing");
        Console.WriteLine(e.Message);
        return;
    }
    Console.SetOut(doubleWriter);
    Console.SetIn(loggingReader); // ADDED
}

日志文件内容:

This is output 1
This is output 2
> Test
Test command received
Enter to exit
> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM