Как сохранить вывод консоли в файл? - PullRequest
0 голосов
/ 10 декабря 2018

Мне было интересно, может ли кто-нибудь помочь мне, я пытаюсь сохранить вывод своей консоли в файл, но он занимает только один вывод, и я хочу, чтобы он брал и добавлял вывод каждый раз, когда он отображается в консоли (более или менее каждую секунду), я попробовал несколько разных методов, но, похоже, ничего не работает, и я даже не уверен, возможно ли это.

1) Это была моя первая попытка: требуется только один вывод на консоль, но, как я понял, он должен перенаправитьэто.

                FileStream ostrm;
                StreamWriter writer;
                TextWriter oldOut = Console.Out;
                try
                {
                    ostrm = new FileStream("C:/Users/Joanne/Desktop/WriteLines3.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;
                }
                while(onvifPTZ != null) { 
                Console.SetOut(writer);
                Console.WriteLine("\t Act Value [" + curPan.ToString() +
                                                       "," + curTilt.ToString() +
                                                       "," + curZoom.ToString() + "]");
                Console.WriteLine("\t Ref Value [" + newPTZRef.pan.ToString() +
                                                       "," + newPTZRef.tilt.ToString() +
                                                       "," + newPTZRef.zoom.ToString() + "]");
                Console.WriteLine("\t Dif Value [" + dPan.ToString() +
                                                   "," + dTilt.ToString() +
                                                   "," + dZoom.ToString() + "]");
                Console.SetOut(oldOut);
                writer.Close();
                ostrm.Close();
                Console.WriteLine("Done");

2) И эти два без перенаправления консоли

/*while (onvifPTZ != null)
                {


                    string[] lines = {"\t Act Value [" + curPan.ToString() +
                                                       "," + curTilt.ToString() +
                                                       "," + curZoom.ToString() + "]","\t Ref Value [" + newPTZRef.pan.ToString() +
                                                       "," + newPTZRef.tilt.ToString() +
                                                       "," + newPTZRef.zoom.ToString() + "]", "\t Dif Value [" + dPan.ToString() +
                                                   "," + dTilt.ToString() +
                                                   "," + dZoom.ToString() + "]" + Environment.NewLine };

                        string mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

                    using (StreamWriter outputFile = new StreamWriter(Path.Combine(mydocpath, "WriteLines1.txt")))
                    {
                        foreach (string line in lines)
                            outputFile.WriteLine(line);
                        outputFile.Flush();
                    }

3)

/* string path = @"c://Users//Joanne//Desktop//WriteLines.txt";

                   if (!File.Exists(path))
                   {
                       // Create a file to write to.
                      using (StreamWriter sw = File.CreateText(path))
                       {
                           while(onvifPTZ!=null){ 
                           sw.WriteLine("\t Act Value [" + curPan.ToString() +
                                                          "," + curTilt.ToString() +
                                                          "," + curZoom.ToString() + "]");
                           sw.WriteLine("\t Ref Value [" + newPTZRef.pan.ToString() +
                                                          "," + newPTZRef.tilt.ToString() +
                                                          "," + newPTZRef.zoom.ToString() + "]");
                           sw.WriteLine("\t Dif Value [" + dPan.ToString() +
                                                      "," + dTilt.ToString() +
                                                      "," + dZoom.ToString() + "]");
                               sw.Flush();
                               //sw.Close();
                           }
                       }
                   }


                  /*using (StreamWriter sw = File.AppendText(path)) {
                           while (onvifPTZ != null)
                           {


                               sw.WriteLine("\t Act Value [" + curPan.ToString() +
                                                              "," + curTilt.ToString() +
                                                              "," + curZoom.ToString() + "]");
                               sw.WriteLine("\t Ref Value [" + newPTZRef.pan.ToString() +
                                                              "," + newPTZRef.tilt.ToString() +
                                                              "," + newPTZRef.zoom.ToString() + "]");
                               sw.WriteLine("\t Dif Value [" + dPan.ToString() +
                                                          "," + dTilt.ToString() +
                                                          "," + dZoom.ToString() + "]");
                           sw.Flush();
                           //sw.Close();
                           }


                       }
                   using (StreamReader sr = File.OpenText(path))
                   {
                       string s = "";
                       while ((s = sr.ReadLine()) != null)
                       {
                           Console.WriteLine(s);
                       }
                   }




                  // Open the file to read from.
                  /* using (StreamReader sr = File.OpenText(path))
                   {
                       string s;
                       while ((s = sr.ReadLine()) != null)
                       {
                           Console.WriteLine(s);
                       }
                   }*/

Кажется, ничего не работает должным образом ... Моя консольПохоже, что при каждом движении камера добавляет значение:

[1003]
myTimedFunction got called at 1003
     Act Value [2.777576E-05,0,0]
     Ref Value [0.06279052,0.0125581,0.06279052]
     Dif Value [0.06276274,0.0125581,0.06279052]
[2006]
myTimedFunction got called at 2006
     Act Value [2.777576E-05,0,0.020052]
     Ref Value [0.1253332,0.02506665,0.1253332]
     Dif Value [0.1253055,0.02506665,0.1052812]
[3006]
myTimedFunction got called at 3006
     Act Value [0.06586289,0.02461553,0.06845684]
     Ref Value [0.1873813,0.03747626,0.1873813]
     Dif Value [0.1215184,0.01286074,0.1189245]
[4007]
myTimedFunction got called at 4007
     Act Value [0.09025252,0.02461553,0.1652665]
     Ref Value [0.2486899,0.04973798,0.2486899]
     Dif Value [0.1584374,0.02512245,0.08342336]
[5008]
myTimedFunction got called at 5008
     Act Value [0.1146421,0.02461553,0.2651765]
     Ref Value [0.309017,0.0618034,0.309017]
     Dif Value [0.1943749,0.03718787,0.0438405]
[6008]
myTimedFunction got called at 6008
     Act Value [0.1300313,0.02461553,0.3089309]
     Ref Value [0.3681245,0.07362491,0.3681245]
     Dif Value [0.2380932,0.04900938,0.05919364]
[7009]
myTimedFunction got called at 7009
     Act Value [0.1453651,0.02461553,0.3681368]
     Ref Value [0.4257793,0.08515586,0.4257793]
     Dif Value [0.2804142,0.06054033,0.05764246]
[8009]
myTimedFunction got called at 8009
     Act Value [0.1606989,0.02461553,0.4256926]
     Ref Value [0.4817537,0.09635074,0.4817537]
     Dif Value [0.3210548,0.07173521,0.05606112]
[9010]
myTimedFunction got called at 9010
     Act Value [0.1850885,0.02461553,0.4815482]
     Ref Value [0.5358268,0.1071654,0.5358268]
     Dif Value [0.3507383,0.08254983,0.05427864]
[10010]
myTimedFunction got called at 10010
     Act Value [0.1935887,0.02461553,0.5225022]
     Ref Value [0.5877852,0.117557,0.5877852]
     Dif Value [0.3941965,0.09294152,0.065283]
[11010]
myTimedFunction got called at 11010
     Act Value [0.2179784,0.02461553,0.5454546]
     Ref Value [0.637424,0.1274848,0.637424]
     Dif Value [0.4194456,0.1028693,0.09196943]

Но на самом деле созданные мной файлы принимают только первое значение и ничего более ...

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Грязное решение
Сохраните выходные данные консоли в массиве, а когда вы закроете свое приложение, сохраните его с

File.WriteAllLines("path", array);

Рекомендуемое решение
Используйте одну из многих библиотек журналов, таких как log4net .Я использую это самостоятельно в некоторых из моих проектов, и я действительно могу рекомендовать это.Он также имеет пакет NuGet, который можно загрузить через меню «Управление пакетами nuget» , щелкнув правой кнопкой мыши проект.

Вот небольшой пример использования log4net logger

var log=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

log.Info("Hello World");

Также вам необходимо создать файл конфигурации с именем log4net.config .Здесь у вас есть пример конфигурации, который я использовал с этого сайта , когда я начал с log4net

<log4net>
<root>
  <level value="ALL" />
  <appender-ref ref="console" />
  <appender-ref ref="file" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level %logger - %message%newline" />
  </layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
  <file value="myapp.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="5" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
  </layout>
</appender>
</log4net>

И, наконец, вам нужно добавить эту строку в ваш AssemblyInfo.cs следующая строка: ваша программа загружает файл конфигурации

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

Я надеюсь, что мой awnser был полезным

0 голосов
/ 10 декабря 2018

Подход с первой попытки верен, но ваш Console.SetOut был неправильным.Проверьте код, написанный ниже:

using (var ostrm = new FileStream("C:/Users/dervis.kayimbasioglu/Desktop/WriteLines3.txt", FileMode.OpenOrCreate, FileAccess.Write))
using (var writer = new StreamWriter(ostrm))
{
    Console.SetOut(writer);
    Console.WriteLine("test to be written in file");
    writer.Close();
    ostrm.Close();
}

Console.WriteLine("Done");
...