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 ” :(

4

3 回答 3

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. 利润!!!
于 2013-07-04T17:57:04.590 回答
2
ostrm = new FileStream("./logfile.txt", FileMode.OpenOrCreate, FileAccess.Write);

您使用了错误的 FileMode。

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

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

请参阅有关 FileMode 的 MSDN 文档

于 2013-07-04T18:01:13.710 回答
2

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

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

于 2013-07-04T18:03:12.443 回答