Как сохранить вывод Console.WriteLine в текстовый файл

У меня есть программа, которая выводит различные результаты на консоль командной строки.

Как сохранить вывод в текстовый файл, используя StreamReader или другие методы?

System.Collections.Generic.IEnumerable<String> lines = File.ReadAllLines(@"C:\Test\ntfs8.txt");

foreach (String r in lines.Skip(1))
{
    String[] token = r.Split(',');
    String[] datetime = token[0].Split(' ');
    String timeText = datetime[4];
    String actions = token[2];
    Console.WriteLine("The time for this array is: " + timeText);
    Console.WriteLine(token[7]);
    Console.WriteLine(actions);
    MacActions(actions);
    x = 1;
    Console.WriteLine("================================================");
}

if (x == 2)
{
    Console.WriteLine("The selected time does not exist within the log files!");
}

System.IO.StreamReader reader = ;
string sRes = reader.ReadToEnd();
StreamWriter SW;
SW = File.CreateText("C:\\temp\\test.bodyfile");
SW.WriteLine(sRes);
SW.Close();
Console.WriteLine("File Created");
reader.Close();

Ответ 1

Попробуйте этот пример из этой статьи - Демонстрирует перенаправление вывода Консоли в файл.

using System;
using System.IO;

static public void Main ()
{
    FileStream ostrm;
    StreamWriter writer;
    TextWriter oldOut = Console.Out;
    try
    {
        ostrm = new FileStream ("./Redirect.txt", FileMode.OpenOrCreate, FileAccess.Write);
        writer = new StreamWriter (ostrm);
    }
    catch (Exception e)
    {
        Console.WriteLine ("Cannot open Redirect.txt for writing");
        Console.WriteLine (e.Message);
        return;
    }
    Console.SetOut (writer);
    Console.WriteLine ("This is a line of text");
    Console.WriteLine ("Everything written to Console.Write() or");
    Console.WriteLine ("Console.WriteLine() will be written to a file");
    Console.SetOut (oldOut);
    writer.Close();
    ostrm.Close();
    Console.WriteLine ("Done");
}

Ответ 2

Попробуйте, если это работает:

FileStream filestream = new FileStream("out.txt", FileMode.Create);
var streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);

Ответ 3

За вопрос:

Как сохранить Console.Writeline Outputs в текстовый файл?

Я бы использовал Console.SetOut, как упомянули другие.


Однако, это больше похоже на то, что вы отслеживаете поток вашей программы. Я хотел бы использовать Debug или Trace для отслеживания состояния программы.

Он работает аналогично консоли, кроме того, что у вас больше контроля над вашим входом, например WriteLineIf.

Debug будет работать только в режиме отладки, где Trace будет работать как в режиме отладки, так и в режиме выпуска.

Оба они позволяют слушать, например, выходные файлы или консоль.

TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(tr1);

TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
Debug.Listeners.Add(tr2);

- http://support.microsoft.com/kb/815788

Ответ 4

Вы хотите написать код для этого или просто использовать функцию командной строки 'command redirection' следующим образом:

app.exe → output.txt

как показано здесь: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Архивировано по адресу archive.org)

EDIT: ссылка мертва, вот еще один пример: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm

Ответ 6

Создайте класс Logger (код ниже), замените Console.WriteLine на Logger.Out. В конце напишите в файл строку Log

public static class Logger
{        
     public static StringBuilder LogString = new StringBuilder(); 
     public static void Out(string str)
     {
         Console.WriteLine(str);
         LogString.Append(str).Append(Environment.NewLine);
     }
 }

Ответ 7

Используя только конфигурацию в app.config:

    <system.diagnostics> 
        <trace autoflush="true" indentsize="4"> 
              <listeners> 

              <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>

            <!--
            <add name="logListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TextWriterOutput.log" /> 
            <add name="EventLogListener" type="System.Diagnostics.EventLogTraceListener" initializeData="MyEventLog"/>
             -->

             <!--
              Remove the Default listener to avoid duplicate messages
              being sent to the debugger for display
             -->
             <remove name="Default" />

             </listeners> 
        </trace> 
  </system.diagnostics>

Для тестирования вы можете использовать DebugView перед запуском программы, тогда мы сможем легко просмотреть все сообщения журнала.

Литература:
http://blogs.msdn.com/b/jjameson/archive/2009/06/18/configuring-logging-in-a-console-application.aspx http://www.thejoyofcode.com/from_zero_to_logging_with_system_diagnostics_in_15_minutes.aspx
Перенаправить вывод трассировки в консоль
Проблема перенаправления вывода отладки в файл с помощью прослушивателя трассировки
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics.aspx

Ответ 8

На основании ответа WhoIsNinja:

Этот код будет выводиться как в консоль, так и в строку журнала, которую можно сохранить в файл, либо добавив в него строки, либо перезаписав его.

Имя по умолчанию для файла журнала - "Log.txt" и сохраняется в папке "Приложение".

public static class Logger
{
    public static StringBuilder LogString = new StringBuilder();
    public static void WriteLine(string str)
    {
        Console.WriteLine(str);
        LogString.Append(str).Append(Environment.NewLine);
    }
    public static void Write(string str)
    {
        Console.Write(str);
        LogString.Append(str);

    }
    public static void SaveLog(bool Append = false, string Path = "./Log.txt")
    {
        if (LogString != null && LogString.Length > 0)
        {
            if (Append)
            {
                using (StreamWriter file = System.IO.File.AppendText(Path))
                {
                    file.Write(LogString.ToString());
                    file.Close();
                    file.Dispose();
                }
            }
            else
            {
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path))
                {
                    file.Write(LogString.ToString());
                    file.Close();
                    file.Dispose();
                }
            }               
        }
    }
}

Тогда вы можете использовать это так:

Logger.WriteLine("==========================================================");
Logger.Write("Loading 'AttendPunch'".PadRight(35, '.'));
Logger.WriteLine("OK.");

Logger.SaveLog(true); //<- default 'false', 'true' Append the log to an existing file.