Speichern der Console.WriteLine-Ausgabe in einer Textdatei


97

Ich habe ein Programm, das verschiedene Ergebnisse auf einer Befehlszeilenkonsole ausgibt.

Wie speichere ich die Ausgabe mit einer StreamReaderoder anderen Techniken in einer Textdatei ?

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

Antworten:


149

Versuchen Sie dieses Beispiel aus diesem Artikel - Demonstriert das Umleiten der Konsolenausgabe in eine Datei

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
fügte dies meiner Standard-Testkonsolenvorlage hinzu.
Valamas

Ist es möglich, nur den Abschnitt system.diagnostics von app.config und nicht programmgesteuert zu verwenden? Irgendeine Probe?
Kiquenet

Ist es nicht besser zu nutzen verwenden ?
John

Ich habe eine kleine Utility-Klasse ( DebugLogger) geschrieben, die ich in alle meine Unit-Tests einbeziehe und als initialisiere private static readonly. In der [ClassCleanup]Methode, die ich ausführeDispose()
IAbstract

15
Ich frage mich, ob Sie die Ausgabe auf der Konsole anzeigen und gleichzeitig in einer Datei speichern können.
John Alexiou

54

Versuchen Sie, ob dies funktioniert:

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

3
Gute Antwort - beachten Sie, dass dies die Konsolenausgabe umleitet , sodass Sie nur die Protokollierung erhalten. Sie können auch FileMode.Append verwenden, um vorherige Protokolle zu führen.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)Wenn Sie sich abmelden möchten.
Prüfsumme

22

Für die Frage:

Wie speichere ich Console.Writeline-Ausgaben in einer Textdatei?

Ich würde verwenden, Console.SetOutwie andere erwähnt haben.


Es sieht jedoch eher so aus, als würden Sie Ihren Programmfluss verfolgen. Ich würde in Betracht ziehen, den Programmstatus zu verwenden Debugoder Tracezu verfolgen.

Es funktioniert ähnlich wie die Konsole, außer dass Sie mehr Kontrolle über Ihre Eingabe haben, wie z WriteLineIf.

Debugfunktioniert nur im Debug-Modus, während Tracees sowohl im Debug- als auch im Release-Modus funktioniert.

Beide ermöglichen Listener wie Ausgabedateien oder die Konsole.

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

Möchten Sie Code dafür schreiben oder verwenden Sie einfach die Befehlszeilenfunktion 'Befehlsumleitung' wie folgt:

app.exe >> output.txt

wie hier gezeigt: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Archiviert unter archive.org )

BEARBEITEN: Link tot, hier ist ein weiteres Beispiel: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Diese Lösung ist besser für mich, da ich festgestellt habe, dass meine Ausgabe mit der TextWriter-Lösung abgeschnitten wurde. Wenn Sie einen neuen Link wünschen, suchen Sie nach Befehlsumleitung, z. technet.microsoft.com/en-us/library/bb490982.aspx
Mafue

Die Verwendung der Umleitungsfunktion in z. B. bat / cmd-Dateien bewirkt, dass die Ausgabe auf die Codepage 850 konvertiert wird.
galmok

5

Erstellen Sie eine Klasse Logger (Code unten) und ersetzen Sie Console.WriteLine durch Logger.Out. Schreiben Sie am Ende den String Log in eine Datei

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

Genau das habe ich gesucht.
Jhollman


2

Basierend auf der Antwort von WhoIsNinja:

Dieser Code wird sowohl in die Konsole als auch in eine Protokollzeichenfolge ausgegeben, die in einer Datei gespeichert werden kann, indem Zeilen daran angehängt oder überschrieben werden.

Der Standardname für die Protokolldatei lautet "Log.txt" und wird unter dem Anwendungspfad gespeichert.

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

Dann können Sie es so verwenden:

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
Während großartig, verlieren Sie die Formatierungsfunktion, die in Console.WriteundConsole.WriteLine
Cole Johnson

1

Verwenden Sie nur die Konfiguration in Ihrer 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>

Zum Testen können Sie DebugView verwenden, bevor Sie das Programm ausführen. Anschließend können Sie problemlos alle Protokollmeldungen anzeigen.

Referenzen:
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
Trace-Ausgabe an Konsole
umleiten Problem beim Umleiten der Debug-Ausgabe in eine Datei mithilfe des Trace-Listeners
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Würde dies nicht mit Trace.WriteLine und nicht mit Console.WriteLine funktionieren?
Tomer Cagan

@TomerCagan Verwenden Sie möglicherweise ConsoleTraceListener und Console.SetOut. Weitere Infos in Referenzen.
Kiquenet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.