Come salvare l'output di Console.WriteLine in un file di testo


98

Ho un programma che emette vari risultati su una console a riga di comando.

Come faccio a salvare l'output in un file di testo utilizzando StreamReaderao altre tecniche?

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

Risposte:


150

Prova questo esempio tratto da questo articolo: dimostra il reindirizzamento dell'output della console a un file

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
aggiunto questo al mio modello di console di test standard.
Valamas

È possibile utilizzare solo app.config, non a livello di programmazione, la sezione system.diagnostics? Qualche campione?
Kiquenet

Non è meglio usare usando ?
John

Ho scritto una piccola utility class ( DebugLogger) che includo in tutti i miei unit test e inizializzo come file private static readonly. Nel [ClassCleanup]metodo che Dispose()
eseguo

16
Mi chiedo se puoi mostrare l'output sulla console e salvarlo in un file allo stesso tempo.
John Alexiou

54

Prova se funziona:

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

3
Ottima risposta: nota che questo reindirizza l' output della console, quindi ottieni solo la registrazione. Inoltre, puoi utilizzare FileMode.Append per conservare i registri precedenti.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)se vuoi disattivare il log off.
checksum

22

Per la domanda:

Come salvare gli output di Console.Writeline in un file di testo?

Userei Console.SetOutcome altri hanno già detto.


Tuttavia, sembra più che tu stia tenendo traccia del flusso del tuo programma. Prenderò in considerazione l'utilizzo di Debugo Traceper tenere traccia dello stato del programma.

Funziona in modo simile alla console tranne per il fatto che hai un maggiore controllo sull'input come WriteLineIf.

Debugfunzionerà solo in modalità debug, dove as Traceopererà sia in modalità debug che in modalità rilascio.

Entrambi consentono ascoltatori come file di output o la console.

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

vuoi scrivere codice per quello o usa semplicemente la funzione della riga di comando 'reindirizzamento dei comandi' come segue:

app.exe >> output.txt

come dimostrato qui: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Archiviato su archive.org )

EDIT: link morto, ecco un altro esempio: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Questa soluzione è migliore per me perché ho scoperto che il mio output è stato troncato utilizzando la soluzione TextWriter. Se desideri un nuovo collegamento, cerca il reindirizzamento dei comandi, ad es. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

L'utilizzo della funzione di reindirizzamento, ad esempio, nei file bat / cmd causa la conversione dell'output nella tabella codici 850.
galmok

5

Crea un logger di classe (codice sotto), sostituisci Console.WriteLine con Logger.Out. Alla fine scrivi su un file la stringa 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);
     }
 }

Questo e 'esattamente quello che stavo cercando.
Jhollman,


2

Basato nella risposta di WhoIsNinja:

Questo codice verrà generato sia nella console che in una stringa di registro che può essere salvata in un file, aggiungendovi delle righe o sovrascrivendola.

Il nome predefinito per il file di registro è "Log.txt" e viene salvato nel percorso dell'applicazione.

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

Quindi puoi usarlo in questo modo:

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
Sebbene sia fantastico, perdi la funzionalità di formattazione incorporata in Console.WriteeConsole.WriteLine
Cole Johnson

1

Usando solo la configurazione nel tuo 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>

Per i test, puoi usare DebugView prima di eseguire il programma, quindi possiamo facilmente visualizzare tutti i messaggi di registro.

Riferimenti:
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
Reindirizza l'output di traccia alla console
Problema di reindirizzamento dell'output di debug a un file utilizzando il listener di traccia
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Non funzionerebbe con Trace.WriteLine e non con Console.WriteLine?
Tomer Cagan

@TomerCagan Forse utilizzando ConsoleTraceListener e Console.SetOut. Maggiori informazioni nei riferimenti.
Kiquenet
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.