Jak zapisać dane wyjściowe Console.WriteLine do pliku tekstowego


98

Mam program, który wyświetla różne wyniki na konsoli wiersza poleceń.

Jak zapisać wynik do pliku tekstowego przy użyciu StreamReaderlub innych technik?

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();

Odpowiedzi:


150

Wypróbuj ten przykład z tego artykułu - demonstruje przekierowanie danych wyjściowych konsoli do pliku

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
dodał to do mojego standardowego szablonu konsoli testowej.
Valamas,

Czy jest to możliwe tylko przy użyciu app.config, a nie programowo, w sekcji system.diagnostics? Jakaś próbka?
Kiquenet,

Czy nie lepiej jest używać za pomocą ?
John

Napisałem małą klasę narzędziową ( DebugLogger), którą włączam do wszystkich moich testów jednostkowych i inicjuję jako plik private static readonly. W [ClassCleanup]metodzie, którą Dispose()
wykonuję

17
Zastanawiam się, czy możesz pokazać wyjście na konsoli i jednocześnie zapisać je do pliku.
John Alexiou,

54

Spróbuj, jeśli to działa:

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

3
Świetna odpowiedź - zwróć uwagę, że przekierowuje to wyjście konsoli, więc masz tylko logowanie. Możesz także użyć FileMode.Append, aby zachować poprzednie dzienniki.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)jeśli chcesz się wylogować.
suma kontrolna

22

Na pytanie:

Jak zapisać dane wyjściowe Console.Writeline do pliku tekstowego?

Użyłbym, Console.SetOutjak wspominali inni.


Wygląda jednak bardziej na to, że śledzisz przepływ programu. Rozważałbym użycie Debuglub Traceśledzenie stanu programu.

Działa podobnie do konsoli, z wyjątkiem tego, że masz większą kontrolę nad danymi wejściowymi, takimi jak WriteLineIf.

Debugbędzie działać tylko w trybie debugowania, w którym Tracebędzie działać zarówno w trybie debugowania, jak i zwolnienia.

Oba pozwalają na słuchanie, takie jak pliki wyjściowe lub konsola.

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

chcesz napisać kod do tego, czy po prostu użyj funkcji `` przekierowania poleceń '' w wierszu poleceń w następujący sposób:

app.exe >> output.txt

jak pokazano tutaj: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Archived at archive.org )

EDYCJA: link martwy, oto kolejny przykład: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


To rozwiązanie jest dla mnie lepsze, ponieważ stwierdziłem, że moje dane wyjściowe zostały obcięte za pomocą rozwiązania TextWriter. Jeśli chcesz mieć świeży link, wyszukaj polecenie Przekierowanie np. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

Użycie funkcji przekierowania w np.
Plikach

5

Utwórz klasę Logger (kod poniżej), zamień Console.WriteLine na Logger.Out. Na koniec zapisz do pliku ciąg 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);
     }
 }

To jest dokładnie to, czego szukałem.
Jhollman,


2

Na podstawie odpowiedzi WhoIsNinja:

Ten kod będzie wyświetlany zarówno w konsoli, jak iw ciągu dziennika, który można zapisać w pliku, dołączając do niego wiersze lub zastępując go.

Domyślna nazwa pliku dziennika to „Log.txt” i jest zapisywana w ścieżce aplikacji.

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

Następnie możesz go użyć w ten sposób:

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
Chociaż świetnie, tracisz funkcjonalność formatowania wbudowaną w Console.WriteiConsole.WriteLine
Cole Johnson

1

Używając tylko konfiguracji w pliku 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>

Do testowania możesz użyć DebugView przed uruchomieniem programu, wtedy możemy łatwo przeglądać wszystkie komunikaty dziennika.

Źródła:
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
Przekieruj dane wyjściowe śledzenia do konsoli
Problem z przekierowaniem danych debugowania do pliku za pomocą odbiornika śledzenia
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Czy to nie zadziała z Trace.WriteLine, a nie z Console.WriteLine?
Tomer Cagan

@TomerCagan Może przy użyciu ConsoleTraceListener i Console.SetOut. Więcej informacji w referencjach.
Kiquenet
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.