2015-09-24 41 views
2

Guten Tag! 問題是:我有一些代碼在終端(命令行窗口)上通過Console類打印一些文本消息。我需要將這些信息放在兩個「容器」中 - 終端和文本文件。 有沒有辦法將輸出流添加到Console類,以使其不僅在終端上輸出數據? 如果我不需要更改現有的代碼太多(有很多地方使用Console.Write()Console.WriteLine()),那就太好了。在控制檯和文件上同時寫文本

回答

7

這不是一個完整的實現,但它應該足以讓你開始沿着你尋找的路徑。

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

0

如果不更改代碼,則無法執行此操作。只需創建另一個類,例如「MyConsole」,並向其添加靜態方法「Write()」和「WriteLine()」。從您創建的方法內部調用Console.Write()Console.WriteLine()方法。也調用從您的方法向文件寫入文本的方法。然後使用MyConsole類而不是Console作爲輸出數據。 Visual Studio查找/替換功能將幫助您更改代碼。

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)(假設你設置「線」等於你的控制檯的輸出)

+0

感謝您的答覆,但我認爲你還沒有抓住這一點。看看iamkrillin的回答 –

+0

@ user2123007啊,好的。那麼你應該將自己的答案標記爲問題的解決方案。否則,人們會認爲答案不是你想要的。問候 –