Cara Menyimpan Output Console.WriteLine ke File Teks


98

Saya memiliki program yang mengeluarkan berbagai hasil ke konsol baris perintah.

Bagaimana cara menyimpan output ke file teks menggunakan a StreamReaderatau teknik lain?

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

Jawaban:


150

Coba contoh ini dari artikel ini - Mendemonstrasikan pengalihan output Konsol ke 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
menambahkan ini ke template konsol pengujian standar saya.
Valamas

Apakah mungkin hanya menggunakan app.config, bukan secara terprogram, bagian system.diagnostics? Ada sampel?
Kiquenet

Apakah tidak lebih baik menggunakan menggunakan ?
Yohanes

Saya menulis kelas utilitas kecil ( DebugLogger) yang saya sertakan dalam semua pengujian unit saya dan menginisialisasi sebagai file private static readonly. Dalam [ClassCleanup]metode yang saya jalankanDispose()
IAbstract

17
Saya ingin tahu apakah Anda dapat menampilkan output di konsol dan menyimpannya ke file pada saat yang sama.
John Alexiou

54

Coba jika ini berhasil:

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

3
Jawaban bagus - perhatikan ini mengalihkan keluaran konsol, jadi Anda hanya mendapatkan logging. Selain itu, Anda dapat menggunakan FileMode.Append untuk menyimpan log sebelumnya.
Dunc

3
Console.SetOut(System.IO.TextWriter.Null)jika Anda ingin mematikan log.
checksum

22

Untuk pertanyaan:

Bagaimana cara menyimpan Output Console.Writeline ke file teks?

Saya akan menggunakan Console.SetOutseperti yang disebutkan orang lain.


Namun, sepertinya Anda melacak aliran program Anda. Saya akan mempertimbangkan menggunakan Debugatau Traceuntuk melacak status program.

Ia bekerja serupa dengan konsol kecuali Anda memiliki kontrol lebih besar atas input Anda seperti WriteLineIf.

Debughanya akan beroperasi ketika dalam mode debug dimana as Traceakan beroperasi baik dalam mode debug atau rilis.

Keduanya memungkinkan pendengar seperti file keluaran atau konsol.

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

apakah Anda ingin menulis kode untuk itu atau cukup gunakan fitur baris perintah 'pengalihan perintah' sebagai berikut:

app.exe >> output.txt

seperti yang ditunjukkan di sini: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Diarsipkan di archive.org )

EDIT: tautan mati, berikut contoh lain: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Solusi ini lebih baik bagi saya karena saya menemukan bahwa output saya terpotong menggunakan solusi TextWriter. Jika Anda menginginkan tautan baru, cari Command Redirection mis. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

Menggunakan fitur redirect di misalnya file bat / cmd menyebabkan output akan dikonversi ke codepage 850.
galmok

5

Buat Logger kelas (kode di bawah), ganti Console.WriteLine dengan Logger.Out. Pada akhirnya, tulis ke file string 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);
     }
 }

Inilah yang saya cari.
Jhollman


2

Berdasarkan jawaban oleh WhoIsNinja:

Kode ini akan menampilkan keduanya ke dalam Konsol dan menjadi string Log yang dapat disimpan ke dalam file, baik dengan menambahkan baris ke dalamnya atau dengan menimpanya.

Nama default untuk file log adalah 'Log.txt' dan disimpan di bawah jalur Aplikasi.

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

Kemudian Anda bisa menggunakannya seperti ini:

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
Meskipun hebat, Anda kehilangan fungsionalitas pemformatan yang ada di dalamnya Console.WritedanConsole.WriteLine
Cole Johnson

1

Hanya menggunakan konfigurasi di app.config Anda:

    <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>

Untuk pengujian, Anda bisa menggunakan DebugView sebelum menjalankan program, lalu kita bisa dengan mudah melihat semua pesan log.

Referensi:
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
Mengalihkan keluaran Jejak ke Konsol
Masalah mengarahkan keluaran debug ke file menggunakan pendengar jejak
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Bukankah ini bekerja dengan Trace.WriteLine dan bukan Console.WriteLine?
Tomer Cagan

@TomerCagan Mungkin menggunakan ConsoleTraceListener dan Console.SetOut. Info lebih lanjut di referensi.
Kiquenet
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.