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

4
您好!问题是:我有一些代码,通过Console类在终端(命令行窗口)上打印一些文本消息。我需要将这些信息放置在两个“容器”中 - 终端和文本文件中。是否有一种方法可以向Console类添加输出流,以便它不仅在终端上输出数据?如果我不需要太多更改现有的代码就能实现就太好了(有很多地方使用了Console.Write()Console.WriteLine())。
4个回答

9
这不是完整实现,但足以让你开始迈向所需的道路。
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”中。

这正是我正在寻找的。 - aminvincent

0

你不能在不改变代码的情况下完成它。只需创建另一个类,例如"MyConsole",并添加静态方法"Write()"和"WriteLine()"。从你创建的方法内部调用Console.Write()Console.WriteLine()方法。还要从你的方法中调用写入文件的方法。然后使用你的MyConsole类来输出数据,而不是使用Console。Visual Studio的查找/替换功能将帮助你更改代码。


0

我无法让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
    }
}

0

您应该使用 StreamWriter。它需要最少的额外代码。 按照以下示例操作即可。

  • 为了使此代码正常工作,您需要输入 "using System.IO"。别忘了写入它。

  • "YourTextFile.txt" 需要 .txt 扩展名。

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

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


解决方案 首先在Visual Studio中创建一个文本文件YourTextFile.txt。然后在右侧的“解决方案资源管理器”菜单中,单击YourTextFile以查看下面的属性。将属性“复制到输出目录”从“不复制”更改为“始终复制”。(这是绝对必要的)
    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();
        }
      }
    }

这应该可以完成任务。我不知道你在控制台中的输出是什么样子的,但如果它不只是一行,并且有多个Console.Writelines向控制台输出,则可以使用whileif来检查控制台的每一行,如果它不是null,则将其写出。例如:while (line != null),然后是if (line != null)(假设你将“line”设置为等于控制台中的输出)


谢谢回复,但我认为你没有抓住重点。看一下iamkrillin的回答。 - Illia Levandovskyi
@user2123007 哦,好的。你应该将他的答案标记为解决方案,否则人们会认为答案不是你想要的。祝好。 - nunsy grey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接