Console.WriteLine Çıktısını Metin Dosyasına Kaydetme


98

Bir komut satırı konsoluna çeşitli sonuçlar veren bir programım var.

Çıkışı bir StreamReaderveya başka teknikler kullanarak bir metin dosyasına nasıl kaydederim ?

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

Yanıtlar:


151

Bu makaledeki bu örneği deneyin - Konsol çıktısını bir dosyaya yeniden yönlendirmeyi gösterir

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
bunu standart test konsolu şablonuma ekledi.
Valamas

Bu, programlı olarak section system.diagnostics değil, yalnızca app.config kullanılarak mümkün müdür? Herhangi bir örnek?
Kiquenet

Kullanmak daha iyi değil mi?
John

Ben küçük bir yardımcı sınıf (yazdım DebugLoggerbenim birim testlerin tümünde içermekte olup olarak başlangıç durumuna getirilmelidir) private static readonly. Gelen [ClassCleanup]yöntemle Ben yürütmekDispose()
IAbstract

18
Çıkışı konsolda gösterebilir misin merak ediyorum ve aynı zamanda bir dosyaya kaydetme o var.
John Alexiou

54

Bu işe yararsa deneyin:

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

3
Harika yanıt - bunun konsol çıktısını yeniden yönlendirdiğini unutmayın , böylece yalnızca günlük kaydı alırsınız. Ayrıca, önceki günlükleri saklamak için FileMode.Append'i kullanabilirsiniz.
Duncan

4
Console.SetOut(System.IO.TextWriter.Null)oturumu kapatmak istiyorsanız.
sağlama toplamı

22

Soru için:

Console.Writeline Çıktıları metin dosyasına nasıl kaydedilir?

Console.SetOutBaşkalarının da bahsettiği gibi kullanırdım .


Ancak, daha çok program akışınızı takip ediyorsunuz gibi görünüyor. Program durumunu kullanmayı Debugveya Tracetakip etmeyi düşünürdüm .

Girişiniz üzerinde daha fazla kontrole sahip olmanız dışında konsola benzer şekilde çalışır WriteLineIf.

DebugTracehem hata ayıklama hem de bırakma modunda çalışacağı hata ayıklama modunda çalışacaktır.

Her ikisi de çıktı dosyaları veya konsol gibi dinleyicilere izin verir.

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

bunun için kod yazmak mı yoksa sadece komut satırı özelliği olan 'komut yeniden yönlendirme'yi mi kullanmak istiyorsunuz?

app.exe >> output.txt

burada gösterildiği gibi: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ ( archive.org'da arşivlenmiştir )

DÜZENLEME: bağlantı ölü, işte başka bir örnek: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm


Bu çözüm benim için daha iyi çünkü çıktımın TextWriter çözümü kullanılarak kesildiğini buldum. Yeni bir bağlantı istiyorsanız, örneğin Komut Yeniden Yönlendirme'yi arayın. technet.microsoft.com/en-us/library/bb490982.aspx
mafue

Örneğin bat / cmd dosyalarında yeniden yönlendirme özelliğini kullanmak, çıktının 850 kod sayfasına dönüştürülmesine neden olur.
galmok

5

Bir sınıf Logger oluşturun (aşağıdaki kod), Console.WriteLine'ı Logger.Out ile değiştirin. Sonunda bir dosyaya Log dizesini yazın.

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

Bu tam olarak aradığım şey.
Jhollman


2

WhoIsNinja'nın cevabına göre:

Bu kod, hem Konsola hem de bir dosyaya satırlar ekleyerek veya üzerine yazarak kaydedilebilen bir Günlük dizesine çıktı verir.

Günlük dosyasının varsayılan adı 'Log.txt'dir ve Uygulama yolu altında kaydedilir.

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

O zaman bunu şu şekilde kullanabilirsiniz:

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
Harika olsa da, yerleşik biçimlendirme işlevini kaybedersiniz Console.WriteveConsole.WriteLine
Cole Johnson

1

App.config dosyanızda yalnızca yapılandırmayı kullanarak:

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

Test için programı çalıştırmadan önce DebugView'ı kullanabilirsiniz , ardından tüm günlük mesajlarını kolayca görüntüleyebiliriz.

Referanslar:
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
İzleme çıktısını Konsola
yeniden yönlendir Hata ayıklama çıktısını izleme dinleyicisini kullanarak bir dosyaya yeniden yönlendirme sorunu
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics .aspx


Bu, Console.WriteLine ile değil Trace.WriteLine ile çalışmaz mı?
Tomer Cagan

@TomerCagan Belki ConsoleTraceListener ve Console.SetOut kullanıyor. Referanslarda daha fazla bilgi.
Kiquenet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.