Захват консольного потока ввода - PullRequest
4 голосов
/ 06 октября 2010

Я хотел бы создать консольное приложение (c # 3.5), которое читает поток ввода.

Примерно так:

dir> MyApplication.exe

Приложение читает каждыйлинии и выводит что-то на консоль.

Какой путь?

Спасибо

Ответы [ 4 ]

4 голосов
/ 06 октября 2010

Вы должны использовать канал (|) для передачи вывода dir в приложение. Редирект (>), который вы использовали в своем примере, соединит файл Application.exe и запишет туда вывод команды dir, что приведет к повреждению приложения.

Для чтения данных с консоли необходимо использовать метод Console.ReadLine , например:

using System;

public class Example
{
   public static void Main()
   {
      string line;
      do { 
         line = Console.ReadLine();
         if (line != null) 
            Console.WriteLine("Something.... " + line);
      } while (line != null);   
   }
}
3 голосов
/ 06 октября 2010

Используйте консоль. Чтение / ReadLine для чтения из стандартного входного потока.

Кроме того, вы можете получить прямой доступ к потоку (как TextReader) через Console.In .

1 голос
/ 14 июля 2012

Практика добавления в ваше оконное приложение или любой другой тип интеграции приведена ниже:

static public void test()
{
    System.Diagnostics.Process cmd = new System.Diagnostics.Process();

    cmd.StartInfo.FileName = "cmd.exe";
    cmd.StartInfo.RedirectStandardInput = true;
    cmd.StartInfo.RedirectStandardOutput = true;
    cmd.StartInfo.CreateNoWindow = true;
    cmd.StartInfo.UseShellExecute = false;

    cmd.Start();

    /* execute "dir" */

    cmd.StandardInput.WriteLine("dir");
    cmd.StandardInput.Flush();
    cmd.StandardInput.Close();
    string line;
    int i = 0;

    do
    {
        line = cmd.StandardOutput.ReadLine();
        i++;
        if (line != null)
            Console.WriteLine("Line " +i.ToString()+" -- "+ line);
    } while (line != null);

}

static void Main(string[] args)
{
    test();
}
0 голосов
/ 06 октября 2010

Это действительно зависит от того, что вы хотите сделать и с каким типом потока вы хотите работать. Предположительно, вы говорите о чтении текстового потока (на основе «приложение читает каждую строку ...»). Поэтому вы можете сделать что-то вроде этого:

    using (System.IO.StreamReader sr = new System.IO.StreamReader(inputStream))
    {
        string line;
        while (!string.IsNullOrEmpty(line = sr.ReadLine()))
        {
            // do whatever you need to with the line
        }
    }

Ваш inputStream будет иметь тип System.IO.Stream (например, FileStream).

...