如何将控制台文本复制到文本文件?

时间:2013-07-04 17:30:40

标签: c#

如何将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 ”:(

3 个答案:

答案 0 :(得分:3)

  1. 创建一个派生自TextWriter
  2. 的类
  3. 允许它占用您想要的任意数量的实例(例如writers
  4. 在派生类中实施TextWriter,将数据输出到writers的每个实例
  5. 创建派生类的实例(例如:new Foo(Console.Out, File.CreateText("Foo"))
  6. Console.SetOut(the_instance_of_your_textwriter)
  7. PROFIT !!!

答案 1 :(得分:2)

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

您使用的是错误的FileMode。

OpenOrCreate会生成一个从文件开头开始的流。因此,您覆盖现有数据。每次调用此函数时,都会覆盖现有内容 - 这就是您只有最后一行的原因。

您想要使用FileMode.Append,如果文件存在则会打开该文件,如果不存在则创建它,重要的是将寻找文件的末尾,然后从那里开始编写。每次调用函数时,都会将数据添加到文件末尾。

请参阅the MSDN documentation on FileMode

答案 2 :(得分:2)

似乎FileMode.OpenOrCreate将Position设置为0,因此每次打开文件时都会覆盖该文件。要快速解决问题,请使用FileMode.Append

但更易于维护的解决方案可能是使用像Log4Net这样的日志库。