как "поймать" данные из консоли?
Незнаю как "ловить" сообщения которые выводит консоль.
Хочу сделать так чтоб один поток писал вывод в консоль, а другой "ловил" сообщения из консоли и также выводил в консоль слегка измененное сообщение :3
Как ловить выведенные данные из консоли ??
вот код :
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics;
using System.ComponentModel;
using System.Collections;
using System.Globalization;
namespace trimtram
{
class Program
{
static void Terminal()
{
for (; ; )
{
for (int i = 0; i<1000; i++)
{
Console.WriteLine("Ввод чепушильных слов {0}.", i);
Thread.Sleep(1000); // чтоб не так часто выводил
}
}
}
static void Lovitel()
{
// вот тут мы ловим то что пишет "первый"(Терминал) поток
// как это сделать ????
}
static void Main()
{
Console.WriteLine("Тестовая прога.");
Console.WriteLine("Пытаемся словить \"терминал\" на сишарп.");
// в одном потоке создаём сообщения
new Thread(() => Terminal()).Start();
// в втором потоке ловим сообщения
new Thread(() => Lovitel()).Start();
}
}
}
Ответы (2 шт):
Автор решения: Alexander Petrov
→ Ссылка
Как вариант, могу предложить задать консоли собственный поток вывода. В нём можно сделать любую обработку данных.
Полный пример приложения:
using System;
using System.IO;
using System.Text;
using System.Threading;
namespace ConApp1
{
class Program
{
static void Terminal()
{
for (int i = 0; i < 30; i++)
{
Console.WriteLine("Ввод чепушильных слов {0}.", i);
Thread.Sleep(100);
}
}
static void Main()
{
var previousWriter = Console.Out;
var interceptor = new WriterInterceptor(Console.Out);
Console.SetOut(interceptor);
var t = new Thread(Terminal);
t.Start();
t.Join();
// Возвращаем на место стандартный поток вывода
Console.SetOut(previousWriter);
}
}
public class WriterInterceptor : TextWriter
{
private TextWriter _baseWriter;
public WriterInterceptor(TextWriter baseWriter)
{
_baseWriter = baseWriter;
}
public override Encoding Encoding => null;
public override void WriteLine(string value)
{
value = value.Replace("5", "пять");
_baseWriter.WriteLine(value);
}
// Здесь перегрузки остальных методов Write...
}
}
В данном примере второй поток не нужен.
Конечно, нужно перегрузить все методы вывода TextWriter'а, которые будут использоваться.
Автор решения: timob256
→ Ссылка
Спасибо @AlexanderPetrov за ProcessStartInfo.RedirectStandardOutput
Помогло :3
Вот пример:
using System;
using System.IO;
using System.Diagnostics;
public class Test
{
public static void Main()
{
// создаем процесс "терминал" с параметрами "ifconfig "
ProcessStartInfo psiOpt = new ProcessStartInfo("ifconfig");
// скрываем окно запущенного процесса
psiOpt.WindowStyle = ProcessWindowStyle.Hidden;
// настраиваем процесс
psiOpt.RedirectStandardOutput = true;
psiOpt.UseShellExecute = false;
psiOpt.CreateNoWindow = true;
// запускаем процесс
Process procCommand = Process.Start(psiOpt);
// получаем ответ запущенного процесса
StreamReader srIncoming = procCommand.StandardOutput;
// выводим результат
Console.WriteLine(srIncoming.ReadToEnd());
// закрываем процесс
procCommand.WaitForExit();
// вводим одну клавишу и закрываем программу
Console.ReadKey();
}
}
Вот вывод:
dima@komp:~/mita/TCP_IP$ mcs lovla_terminal2.cs
dima@komp:~/mita/TCP_IP$ mono lovla_terminal2.exe
eno1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 50:46:5d:6f:da:ba txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 20 memory 0xf7200000-f7220000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Локальная петля (Loopback))
RX packets 82006 bytes 6003526 (6.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 82006 bytes 6003526 (6.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.41 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::49c3:4320:6ca9:3849 prefixlen 64 scopeid 0x20<link>
ether 50:3e:aa:60:a1:34 txqueuelen 1000 (Ethernet)
RX packets 1408812 bytes 1912231031 (1.9 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 808121 bytes 115067922 (115.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
mdima@komp:~/mita/TCP_IP$