2015-06-24 4 views
1

Я довольно много программируюсь, и сейчас я застрял в этом. Я использую следующий код для получения непрерывного вывода данных, передаваемого в командной строке. Как я могу гарантировать, что результат будет скопирован в текстовый файл после закрытия запроса вручную?Как сохранить непрерывный вывод консоли в текстовый файл в C#?

public static void Main(string[] args) 
{ 
    Connector connector; 
    Console.WriteLine("HelloEEG!"); 

    // Initialize a new Connector and add event handlers 
    connector = new Connector(); 
    connector.DeviceConnected += new EventHandler(OnDeviceConnected); 
    connector.DeviceConnectFail += new EventHandler(OnDeviceFail); 
    connector.DeviceValidating += new EventHandler(OnDeviceValidating); 

    // Scan for devices across COM ports 
    // The COM port named will be the first COM port that is checked. 
    connector.ConnectScan("COM40"); 

    // Blink detection needs to be manually turned on 
    connector.setBlinkDetectionEnabled(true); 

    Thread.Sleep(400000); 

    System.Console.WriteLine("Goodbye."); 
    connector.Close(); 
    Environment.Exit(0); 
} 

// Called when a device is connected 
static void OnDeviceConnected(object sender, EventArgs e) 
{ 
    Connector.DeviceEventArgs de = (Connector.DeviceEventArgs)e; 

    Console.WriteLine("Device found on: " + de.Device.PortName); 

    de.Device.DataReceived += new EventHandler(OnDataReceived); 
} 

// Called when scanning fails 

static void OnDeviceFail(object sender, EventArgs e) 
{ 
    Console.WriteLine("No devices found! :("); 
} 

// Called when each port is being validated 
static void OnDeviceValidating(object sender, EventArgs e) 
{ 
    Console.WriteLine("Validating: "); 
} 

// Called when data is received from a device 
static void OnDataReceived(object sender, EventArgs e) 
{ 
    Device.DataEventArgs de = (Device.DataEventArgs)e; 
    DataRow[] tempDataRowArray = de.DataRowArray; 

    TGParser tgParser = new TGParser(); 
    tgParser.Read(de.DataRowArray); 

    /* Loops through the newly parsed data of the connected headset*/ 
    // The comments below indicate and can be used to print out the different data outputs. 
    for (int i = 0; i < tgParser.ParsedData.Length; i++) 
    { 
     //string temp = tgParser.ParsedData[1].ToString; 
     //Console.WriteLine(tgParser.ParsedData.Length + " + " + temp); 

     if (tgParser.ParsedData[i].ContainsKey("Raw")) 
     { 
      //Console.WriteLine("Raw Value:" + tgParser.ParsedData[i]["Raw"]); 
      //Console.WriteLine("Raw Value:" + tgParser.ParsedData[i]["Raw"]); 
     } 

     if (tgParser.ParsedData[i].ContainsKey("PoorSignal")) 
     { 
      //The following line prints the Time associated with the parsed data 
      //Console.WriteLine("Time:" + tgParser.ParsedData[i]["Time"]); 
      Console.WriteLine("Time:" + tgParser.ParsedData[i]["Time"]); 

      //A Poor Signal value of 0 indicates that your headset is fitting properly 
      Console.WriteLine("Poor Signal:" + tgParser.ParsedData[i]["PoorSignal"]); 

      poorSig = (byte)tgParser.ParsedData[i]["PoorSignal"]; 
     } 

     if (tgParser.ParsedData[i].ContainsKey("Attention")) 
     { 
      //Console.WriteLine("Att Value:" + tgParser.ParsedData[i]["Attention"]); 
      Console.WriteLine("Att Value:" + tgParser.ParsedData[i]["Attention"]); 
     } 

     if (tgParser.ParsedData[i].ContainsKey("Meditation")) 
     { 
      //Console.WriteLine("Med Value:" + tgParser.ParsedData[i]["Meditation"]); 
      Console.WriteLine("Med Value:" + tgParser.ParsedData[i]["Meditation"]); 
     } 

     if (tgParser.ParsedData[i].ContainsKey("EegPowerDelta")) 
     { 
      //Console.WriteLine("Delta: " + tgParser.ParsedData[i]["EegPowerDelta"]); 
      Console.WriteLine("Delta: " + tgParser.ParsedData[i]["EegPowerDelta"]); 
     } 

     if (tgParser.ParsedData[i].ContainsKey("BlinkStrength")) 
     { 
      //Console.WriteLine("Eyeblink " + tgParser.ParsedData[i]["BlinkStrength"]); 
      Console.WriteLine("Eyeblink " + tgParser.ParsedData[i]["BlinkStrength"]); 
     } 
    } 
} 
+0

Вы могли бы легко назвать вашу программку из командной строки и трубы результата в файл: 'stuff.exe> ​​output.txt' – ckruczek

+0

закрытие приглашения вручную выходит приложение таким образом, я предлагаю вам создать свое приложение как процесс достигните этого! – Bellash

+0

измените вашу консольную запись на использование пользовательского класса 'MyConsoleWriter' и напишите в файл и консоль с каждым вызовом. Тогда вы можете быть уверены, что файл всегда обновляется. Или, что еще лучше, поместите это и интерфейс. – Jonesopolis

ответ

3

Будет намного лучше регистрировать каждый вывод консоли в файл, как это происходит. Вместо ожидания записи в файл, когда приложение закрывается вручную. Чтобы сэкономить много кода, вы можете использовать log4net для обработки журнала.

0

Там в нескольких различных способах приближения к этому, и с небольшим количеством исследований, я уверен, что вы могли бы найти несколько, однако это решение, которое я хотел бы использовать для этого конкретного действия:

Как Джоунси упоминается в комментарии, я бы в первую очередь убрал ваш главный. Создайте отдельный класс для одновременного выполнения сценария консоли и вывода текста.

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

0

Это может сработать.

public static void WriteToFileAndConsole() 
{ 
    string outFile = "ConsoleOut.txt"; 
    using (FileStream fileStream = new FileStream(outFile, FileMode.OpenOrCreate)) 
    { 
     using (StreamWriter writer = new StreamWriter(fileStream)) 
     { 
      using (TextWriter originalConsoleOut = Console.Out) 
      { 
       Console.SetOut(writer); 
       Console.WriteLine("Hello To File"); 
       Console.SetOut(originalConsoleOut); 
      } 
     } 
    } 
    Console.WriteLine("Hello to console only"); 
} 
Смежные вопросы