2013-07-04 172 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

相关问题