同时在控制台和文件上写入文本

本文关键字:文本 文件 控制台 | 更新日期: 2023-09-27 18:14:23

标签!问题是:我有一些代码,通过终端(命令行窗口)上的Console类打印一些文本消息。我需要这个信息被放置在两个"容器"-终端和文本文件。是否有一种方法可以将输出流添加到Console类,以使其不仅在终端上输出数据?如果我不需要太多地改变现有的代码(有很多地方使用Console.Write()Console.WriteLine()),那就太好了。

同时在控制台和文件上写入文本

这不是一个完整的实现,但它应该足以让您开始寻找路径。

class Program
    {
        static void Main(string[] args)
        {
            DualOut.Init();
            Console.WriteLine("Hello");

            Console.ReadLine();
        }
    }
    public static class DualOut
    {
        private static TextWriter _current;
        private class OutputWriter : TextWriter
        {
            public override Encoding Encoding
            {
                get
                {
                    return _current.Encoding;
                }
            }
            public override void WriteLine(string value)
            {
                _current.WriteLine(value);
                File.WriteAllLines("Output.txt", new string[] { value });
            }
        }
        public static void Init()
        {
            _current = Console.Out;
            Console.SetOut(new OutputWriter());
        }
    }

如果运行这段代码,您将看到"Hello"被打印到控制台和文件"Output.txt"

不修改代码是做不到的。只需创建另一个类,例如"MyConsole",并为其添加静态方法"Write()"answers"WriteLine()"。从创建的方法内部调用Console.Write()Console.WriteLine()方法。还可以调用从方法向文件写入文本的方法。然后使用MyConsole类而不是Console来输出数据。Visual Studio查找/替换功能将帮助您更改代码

您应该使用StreamWriter。它需要最少的额外代码。遵循这个例子,它将工作。

  • 你需要输入"using System"。为了使这段代码工作。别忘了写

  • "YourTextFile.txt"需要。txt.

  • 为了在文本文件中看到结果,您需要进入计算机中的实际文件夹,并从那里打开文本文件。Visual Studio中的文本文件将显示为空。

(例如:c:/documents/visualstudio/projects/ConsoleApplication1/bin/debug/YourTextFile.txt)


<

解决方案/strong>首先在Visual Studio中创建一个文本文件YourTextFile.txt。然后在右侧的解决方案资源管理器菜单中,单击YourTextFile以查看解决方案资源管理器下面的属性。将属性"Copy to Output Directory"从"Do Not Copy"更改为"Copy Always"。(这是绝对必须的)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    namespace ConsoleApplication1
    {
       class Answer
      {
          static void Main(string[] args)
        {
          string text = "This text will appear on your console and be saved in the txt file";
            Console.WriteLine(text);
            StreamWriter saveText = new StreamWriter("YourTextFile.txt");
            saveText.WriteLine(text);
            saveText.Close();
            Console.ReadLine();
        }
      }
    }

这个应该可以了。我不知道控制台的输出是什么样子,但如果不是一行,而且有多个控制台。将输出写入到控制台,然后您可以使用whileif来检查控制台的每一行,如果不是null,则将其写出来。例如while (line != null)后面跟着if (line != null)(假设你设置"line"等于控制台的输出)

我无法使用iamkrillin的邮件。

但是下面的代码可以工作:

class Program
{
    static void Main(string[] args)
    {
        ConsoleFileOutput cf = new ConsoleFileOutput("Output.txt", Console.Out);
        Console.SetOut(cf);
        Console.WriteLine("0ne");
        Console.WriteLine("two");
        Console.WriteLine("three");
        cf.Close();
    }
    public class ConsoleFileOutput : TextWriter
    {
        #region Fields  
        private Encoding encoding = Encoding.UTF8;
        private StreamWriter writer;
        private TextWriter console;
        #endregion
        #region Properties  
        public override Encoding Encoding
        {
            get
            {
                return encoding;
            }
        }
        #endregion
        #region Constructors  
        public ConsoleFileOutput(string filePath, TextWriter console, Encoding encoding = null)
        {
            if (encoding != null)
            {
                this.encoding = encoding;
            }
            this.console = console;
            this.writer = new StreamWriter(filePath, false, this.encoding);
            this.writer.AutoFlush = true;
        }
        #endregion
        #region Overrides  
        public override void Write(string value)
        {
            Console.SetOut(console);
            Console.Write(value);
            Console.SetOut(this);
            this.writer.Write(value);
        }
        public override void WriteLine(string value)
        {
            Console.SetOut(console);
            Console.WriteLine(value);
            this.writer.WriteLine(value);
            Console.SetOut(this);
        }
        public override void Flush()
        {
            this.writer.Flush();
        }
        public override void Close()
        {
            this.writer.Close();
        }
        #endregion
        #region IDisposable  
        new public void Dispose()
        {
            this.writer.Flush();
            this.writer.Close();
            this.writer.Dispose();
            base.Dispose();
        }
        #endregion
    }
}