Comment enregistrer la sortie Console.WriteLine dans un fichier texte


98

J'ai un programme qui produit divers résultats sur une console de ligne de commande.

Comment enregistrer la sortie dans un fichier texte en utilisant une StreamReaderou d'autres techniques?

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

Réponses:


150

Essayez cet exemple de cet article - Démontre la redirection de la sortie de la console vers un fichier

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
ajouté ceci à mon modèle de console de test standard.
Valamas

Est-il possible d'utiliser uniquement app.config, pas par programme, section system.diagnostics? Un échantillon?
Kiquenet

N'est-il pas préférable d'utiliser l' utilisation ?
John

J'ai écrit une petite classe utilitaire ( DebugLogger) que j'inclus dans tous mes tests unitaires et que j'initialise en tant que private static readonly. Dans la [ClassCleanup]méthode que Dispose()
j'exécute

16
Je me demande si vous pouvez afficher la sortie sur la console et la sauvegarder dans un fichier en même temps.
John Alexiou

54

Essayez si cela fonctionne:

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

3
Excellente réponse - notez que cela redirige la sortie de la console, de sorte que vous n'obtenez que la journalisation. Vous pouvez également utiliser FileMode.Append pour conserver les journaux précédents.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)si vous souhaitez désactiver la connexion.
somme de contrôle du

22

Pour la question:

Comment enregistrer les sorties Console.Writeline dans un fichier texte?

J'utiliserais Console.SetOutcomme d'autres l'ont mentionné.


Cependant, il semble que vous gardiez une trace de votre flux de programme. J'envisagerais d'utiliser Debugou Tracepour garder une trace de l'état du programme.

Cela fonctionne de la même manière que la console, sauf que vous avez plus de contrôle sur vos entrées telles que WriteLineIf.

Debugne fonctionnera qu'en mode débogage alors que as Tracefonctionnera à la fois en mode débogage ou en mode version.

Ils permettent tous deux des écouteurs tels que les fichiers de sortie ou 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

voulez-vous écrire du code pour cela ou simplement utiliser la fonction de ligne de commande 'redirection de commande' comme suit:

app.exe >> output.txt

comme démontré ici: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Archivé sur archive.org )

EDIT: link dead, voici un autre exemple: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Cette solution est meilleure pour moi car j'ai trouvé que ma sortie était tronquée à l'aide de la solution TextWriter. Si vous voulez un nouveau lien, recherchez la redirection de commande, par exemple. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

L'utilisation de la fonction de redirection dans les fichiers bat / cmd, par exemple, entraîne la conversion de la sortie en page de codes 850.
galmok

5

Créez une classe Logger (code ci-dessous), remplacez Console.WriteLine par Logger.Out. À la fin, écrivez dans un fichier la chaîne 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);
     }
 }

Ceci est exactement ce que je cherchais.
Jhollman


2

Basé sur la réponse de WhoIsNinja:

Ce code sortira à la fois dans la console et dans une chaîne de journal qui peut être enregistrée dans un fichier, soit en y ajoutant des lignes, soit en l'écrasant.

Le nom par défaut du fichier journal est «Log.txt» et est enregistré sous le chemin de l'application.

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

Ensuite, vous pouvez l'utiliser comme ceci:

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
Bien que génial, vous perdez la fonctionnalité de formatage intégrée à Console.WriteetConsole.WriteLine
Cole Johnson

1

En utilisant uniquement la configuration dans votre 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>

Pour les tests, vous pouvez utiliser DebugView avant d'exécuter le programme, puis nous pouvons facilement afficher tous les messages du journal.

Références:
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
Rediriger la sortie de trace vers la console
Problème de redirection de la sortie de débogage vers un fichier à l'aide de l'écouteur de trace
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Cela ne fonctionnerait-il pas avec Trace.WriteLine et non avec Console.WriteLine?
Tomer Cagan

@TomerCagan Peut-être en utilisant ConsoleTraceListener et Console.SetOut. Plus d'informations dans les références.
Kiquenet
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.