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

我目前正试图找出记录用户输入和控制台生成的输出的最佳方法。

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

}

这种方法对于控制台的输出是很好的,但是我还是不明白,如何添加用户的输入。这也是我想用uesr输入实现的。

非常感谢

解决方案:

事实上,同样的方法。

注意这个类目前只实现了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
> 

给TA打赏
共{{data.count}}人
人已打赏
未分类

为什么我可以在textPersonName中输入数字?[重复]

2022-9-8 21:05:19

未分类

为什么改变我的变量值不影响我的列表?

2022-9-8 21:05:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索