Записывать пользовательский ввод в консольное приложение c#, а также выводить консоль - PullRequest
0 голосов
/ 24 апреля 2020

В настоящее время я пытаюсь выяснить, как лучше всего регистрировать пользовательский ввод, а также вывод, генерируемый консолью. Мой текущий подход использует:

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.

Большое спасибо!

1 Ответ

1 голос
/ 24 апреля 2020

Точно так же, на самом деле.

Обратите внимание, что этот класс сейчас только реализует 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
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...