2013-07-04 99 views
0

如何將Console.WriteLine複製到文本文件?如何將控制檯文本複製到文本文件?

static void ConsoleWrite(String value, ConsoleColor color) 
     {   
     Console.ForegroundColor = color; 
     FileStream ostrm; 
     StreamWriter writer; 
     TextWriter oldOut = Console.Out; 

     try 
     { 
      ostrm = new FileStream("./logfile.txt", FileMode.OpenOrCreate, FileAccess.Write); 
      writer = new StreamWriter(ostrm); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Cannot open logfile.txt for writing"); 
      Console.WriteLine(e.Message); 
      return; 
     } 
     Console.SetOut(writer); 
     Console.SetError(writer); 
     Console.WriteLine(value.PadRight(Console.WindowWidth - 1)); 
     Console.SetError(oldOut); 
     Console.SetOut(oldOut); 
     Console.WriteLine(value.PadRight(Console.WindowWidth - 1)); 
     writer.Close(); 
     ostrm.Close(); 
    } 

此代碼只寫最後一行。

(我需要在控制檯中顯示文本,並在同一時間將文本保存到一個文件中。)

ConsoleWrite("test1",ConsoleColor.Red); 
ConsoleWrite("test2",ConsoleColor.Red); 
ConsoleWrite("test3",ConsoleColor.Red); 

在該文件中只有一行被保存:「TEST3」 :(

+0

您在關閉它之前是否嘗試過沖洗作者? '作家.Flush()' – Dan

+0

所有相同的只有最後一行被保存。 –

回答

2

似乎FileMode.OpenOrCreate將位置設置爲0,所以每次你打開它時該文件被覆蓋。要快速修復,請使用FileMode.Append

但更可維護的解決方案可能會使用像Log4Net這樣的日誌庫。

+0

謝謝,它的工作原理。 –

3
  1. 創建一個從TextWriter
  2. 派生的類允許它需要儘可能多的情況下,你想要的(比如writers
  3. 在派生類中實現TextWriter輸出數據的writers
  4. 每個實例創建派生類的實例(如:new Foo(Console.Out, File.CreateText("Foo"))
  5. Console.SetOut(the_instance_of_your_textwriter)
  6. 利潤!
+0

我不知道如何正確編寫代碼 –

+0

@BrainOverflow:這是微不足道的,並將非常值得學習如何(一些)面向對象的原則工作。 – leppie

2
ostrm = new FileStream("./logfile.txt", FileMode.OpenOrCreate, FileAccess.Write); 

你使用了錯誤的FileMode。

OpenOrCreate產生一個從文件開始處開始的流。因此,您覆蓋現有的數據。每次調用此函數時,現有內容都會被覆蓋 - 這就是爲什麼您只有最後一行。

你想要使用FileMode.Append,如果它存在,它將打開文件,如果沒有,則創建它,重要的是將尋找到文件的結尾,然後開始從那裏寫入。每次調用函數時,都會將數據添加到文件的末尾。

the MSDN documentation on FileMode

相關問題