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

C# 同时在控制台和文件上写入文本,c#,logging,stream,console,C#,Logging,Stream,Console,古滕标签! 问题是:我有一些代码,可以通过终端(命令行窗口)上的控制台类打印一些文本消息。我需要将这些信息放在两个“容器”中-终端和文本文件。 是否有一种方法可以将输出流添加到控制台类中,以使其不仅在终端上输出数据? 如果我不需要太多地更改现有代码(在很多地方都使用了Console.Write()和Console.WriteLine()),那就太糟糕了。如果不更改代码,你就做不到。只需创建另一个类,例如“MyConsole”,并向其中添加静态方法“Write()”和“WriteLine()”。从

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

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

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

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”

您应该使用
StreamWriter
。它需要最少的额外代码。 按照这个例子,它会起作用

  • 您需要键入“using System.IO”才能使此代码正常工作。别忘了写

  • “YourTextFile.txt”需要.txt

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

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


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



这应该可以完成任务。我不知道您在控制台中的输出是什么样子的,但是如果它不是一行,并且有多个控制台。向控制台提供输出的writeline,那么您可以使用
while
if
,检查控制台的每一行,如果它不是
null
,则将其写出。e、 g.
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
    }
}

谢谢你的答复,但我认为你没有抓住重点。看一看iamkrillin的answer@user2123007啊,好的。那么你应该把他的答案标记为你问题的解决办法。否则人们会认为答案不是你想要的。这才是我真正想要的
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
    }
}