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

问题描述:

Guten Tag! 问题是:我有一些代码在终端(命令行窗口)上通过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()); 
     } 
    } 

如果你运行这段代码,你会看到“你好”被打印到控制台和文件“Output.txt的”

+0

这真的是我寻找 – aminvincent

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

您应该使用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)(假设你设置“线”等于你的控制台的输出)

+0

感谢您的答复,但我认为你还没有抓住这一点。看看iamkrillin的回答 –

+0

@ user2123007啊,好的。那么你应该将自己的答案标记为问题的解决方案。否则,人们会认为答案不是你想要的。问候 –