Як зберегти Console.WriteLine вихід у текстовий файл


98

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

Як зберегти вихідні дані у текстовому файлі за допомогою a 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();

Відповіді:


150

Спробуйте цей приклад із цієї статті - демонструє перенаправлення виводу консолі у файл

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");
}

1
додав це до мого стандартного шаблону тестової консолі.
Валамас

Чи можна використовувати лише app.config, а не програмно, розділ system.diagnostics? Будь-який зразок?
Kiquenet

Чи не краще використовувати використання ?
Джон

Я написав невеликий клас утиліти ( DebugLogger), який включаю у всі свої модульні тести та ініціалізую як private static readonly. У [ClassCleanup]методі, який я виконую,Dispose()
IAbstract

16
Цікаво, чи можете ви показати вихідні дані на консолі та заодно зберегти їх у файлі.
John Alexiou

54

Спробуйте, якщо це працює:

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

3
Чудова відповідь - зауважте, що це переспрямовує вихід консолі, тому ви отримуєте лише реєстрацію. Крім того, ви можете використовувати FileMode.Append для збереження попередніх журналів.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)якщо ви хочете вимкнути вихід.
контрольна сума

22

Для питання:

Як зберегти виходи Console.Writeline у ​​текстовий файл?

Я б використав, 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


14

ви хочете написати код для цього або просто скористатися функцією командного рядка "перенаправлення команди" наступним чином:

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


Це рішення краще для мене, оскільки я виявив, що мій результат був усічений за допомогою рішення TextWriter. Якщо ви хочете отримати нове посилання, знайдіть перенаправлення команд, наприклад. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

Використання функції переспрямування, наприклад, у файлах bat / cmd, призводить до перетворення вихідних даних на кодову сторінку 850.
galmok

5

Створіть реєстратор класів (код нижче), замініть 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);
     }
 }

Це саме те, що я шукав.
Jhollman


2

На основі відповіді 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.

1
Хоча це чудово, ви втрачаєте функціонал форматування, вбудований вConsole.WriteConsole.WriteLine
Коул Джонсон

1

Використання лише конфігурації у вашому 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


Чи не буде це працювати з Trace.WriteLine, а не з Console.WriteLine?
Томер Каган

@TomerCagan Можливо за допомогою ConsoleTraceListener та Console.SetOut. Більше інформації у посиланнях.
Kiquenet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.