Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#控制台应用程序中记录用户输入,并将控制台输出_C#_.net_Logging_Input - Fatal编程技术网

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

在c#控制台应用程序中记录用户输入,并将控制台输出,c#,.net,logging,input,C#,.net,Logging,Input,我目前正试图弄清楚,记录用户输入以及控制台生成的输出的最佳方式是什么。 我目前的做法是: class ConsoleCopy : IDisposable { FileStream fileStream; StreamWriter fileWriter; TextWriter doubleWriter; TextWriter oldOut; class DoubleWriter : TextWriter

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

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

    }

这种方法对于控制台输出很有效,但我仍然不知道如何添加用户输入。 我将控制台输出重定向到该文件,同时还能在控制台中看到它。这也是我希望通过uesr输入实现的


非常感谢

实际上也是这样

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

这些将作为成员添加到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
> 

, ... 不要重新发明轮子,没有别的办法吗?这不是我正在寻找的方法。
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
>