【问题标题】:How do I capture standard input if it exists, without waiting for it?如果标准输入存在,我如何捕获它而不等待它?
【发布时间】:2016-05-24 09:12:00
【问题描述】:

我有一个 C# 命令行应用程序。我需要捕获标准输入如果提供了。如果没有,就应该开始执行。

我玩过各种组合:

Console.OpenStandardInput()
Console.ReadLine()
Console.In.Peek()

所有这些都阻塞,等待输入。这不是我想要的。标准输入应该是可选的。如果没有提供,程序应该在没有它的情况下启动,无需等待它。

【问题讨论】:

  • 我只是在这里猜测,但您似乎混淆了命令行参数的标准输入。命令行参数在应用程序启动时提供;标准输入是在 应用程序已经运行之后输入的输入。我怀疑您是否希望人们输入您的程序名称,按回车键,然后立即开始输入;即使是这样,用户也无法以足够快的速度输入来抢占程序启动......
  • 不,我都想要。我有一堆命令行参数,但我也希望人们能够(1)通过管道将数据传输给它,或者(2)将文件内容直接传输给它。喜欢:echo foo | myexe.exemyexe.exe < myfile.txt
  • 那为什么不使用像while ((s = Console.ReadLine()) != null)这样的简单while循环呢?
  • 你到底是什么意思?标准输入将始终存在于控制台应用程序中。但它可能会被重定向到文件或终端。
  • 旁注“捕获”通常用于读取/写入另一个程序的输出...“读取”可能更好。此外,关于重定向到帖子的内嵌评论可能会使您的帖子更容易被未来的访问者识别。

标签: c# command-line-arguments stdin


【解决方案1】:

我想我找到了。这显然是 .NET 4.5 中的新功能

if (Console.IsInputRedirected)
{
    using (var reader = new StreamReader(Console.OpenStandardInput(), Console.InputEncoding))
    {
       _stdin = reader.ReadToEnd();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2017-11-20
    • 2015-07-01
    • 2016-05-13
    相关资源
    最近更新 更多