Как сохранить вывод Console.WriteLine в текстовый файл
У меня есть программа, которая выводит различные результаты на консоль командной строки.
Как сохранить вывод в текстовый файл, используя StreamReader
или другие методы?
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();
Ответы
Ответ 1
Попробуйте этот пример из этой статьи - Демонстрирует перенаправление вывода Консоли в файл.
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");
}
Ответ 2
Попробуйте, если это работает:
FileStream filestream = new FileStream("out.txt", FileMode.Create);
var streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);
Ответ 3
За вопрос:
Как сохранить Console.Writeline Outputs в текстовый файл?
Я бы использовал Console.SetOut
, как упомянули другие.
Однако, это больше похоже на то, что вы отслеживаете поток вашей программы. Я хотел бы использовать Debug
или Trace
для отслеживания состояния программы.
Он работает аналогично консоли, кроме того, что у вас больше контроля над вашим входом, например WriteLineIf
.
Debug
будет работать только в режиме отладки, где Trace
будет работать как в режиме отладки, так и в режиме выпуска.
Оба они позволяют слушать, например, выходные файлы или консоль.
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
Ответ 4
Вы хотите написать код для этого или просто использовать функцию командной строки 'command redirection' следующим образом:
app.exe → output.txt
как показано здесь: http://discomoose.org/2006/05/01/output-redirection-to-a-file-from-the-windows-command-line/ (Архивировано по адресу archive.org)
EDIT: ссылка мертва, вот еще один пример: http://pcsupport.about.com/od/commandlinereference/a/redirect-command-output-to-file.htm
Ответ 5
Используйте Console.SetOut
для перенаправления на TextWriter
, как описано здесь:
http://msdn.microsoft.com/en-us/library/system.console.setout.aspx
Ответ 6
Создайте класс Logger (код ниже), замените Console.WriteLine на Logger.Out.
В конце напишите в файл строку 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);
}
}
Ответ 7
Используя только конфигурацию в 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>
Для тестирования вы можете использовать DebugView перед запуском программы, тогда мы сможем легко просмотреть все сообщения журнала.
Литература:
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
Перенаправить вывод трассировки в консоль
Проблема перенаправления вывода отладки в файл с помощью прослушивателя трассировки
https://ukadcdiagnostics.codeplex.com/
http://geekswithblogs.net/theunstablemind/archive/2009/09/09/adventures-in-system.diagnostics.aspx
Ответ 8
На основании ответа WhoIsNinja:
Этот код будет выводиться как в консоль, так и в строку журнала, которую можно сохранить в файл, либо добавив в него строки, либо перезаписав его.
Имя по умолчанию для файла журнала - "Log.txt" и сохраняется в папке "Приложение".
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();
}
}
}
}
}
Тогда вы можете использовать это так:
Logger.WriteLine("==========================================================");
Logger.Write("Loading 'AttendPunch'".PadRight(35, '.'));
Logger.WriteLine("OK.");
Logger.SaveLog(true); //<- default 'false', 'true' Append the log to an existing file.