检查 C# 中的标准输入

2024-01-03

我正在编写一个小型命令行实用程序,其目的是解析另一个实用程序的输出。我希望它可以通过两种方式调用:

c:\> myutility filewithoutput.txt

Or,

c:\> otherutility -args | myutility

所以,基本上,标准的或文件参数。我的第一次尝试如下所示:

TextReader reader;

if (args.Length > 1) {
    reader = new StreamReader(new FileStream(args[1], FileMode.Open));
} else {
    reader = Console.In;
}

Process(reader);

文件参数工作正常,并且将实用程序的输出通过管道传输到我的实用程序工作正常,但如果您只是正常调用它(没有参数,也没有管道数据),它就会挂起。或者更确切地说,它会阻塞等待从标准输入读取。

我的第二稿如下:

TextReader reader;

if (args.Length > 1) {
    reader = new StreamReader(new FileStream(args[1], FileMode.Open));
} else {
    if(Console.KeyAvailable) {
        reader = Console.In;
    } else {
        Console.WriteLine("Error, need data");
        return;
    }
}

Process(reader);

While KeyAvailable修复了“无输入”问题,如果您尝试通过管道输入数据,它会引发异常 >_

Unhandled Exception: System.InvalidOperationException: Cannot see if a key
has been pressed when either application does not have a console or when
console input has been redirected from a file. Try Console.In.Peek.

at System.Console.get_KeyAvailable()
at MyUtility.Program.Main(String[] args) in Program.cs:line 39

例外情况建议我使用Console.In.Peek,所以我的下一个草稿是这样的:

TextReader reader;

if (args.Length > 1) {
    reader = new StreamReader(new FileStream(args[1], FileMode.Open));
} else {
    if(Console.In.Peek() != 0) {
        reader = Console.In;
    } else {
        Console.WriteLine("Error, need data");
        return;
    }
}

Process(reader);

然而,这与第一次尝试有同样的问题:它会阻塞,寻找输入。Argh!

我有什么遗漏的吗?

旁注:我知道参数“-”的约定意味着“使用标准输入”。如果没有其他办法的话我会用它。但是,肯定有某种方法可以检测标准输入是否是控制台!

编辑:这是似乎可以满足我需要的最终版本:

TextReader reader;

if (args.Length > 1) {
    reader = new StreamReader(new FileStream(args[1], FileMode.Open));
} else {
    try {
        bool tmp = Console.KeyAvailable;
        Console.WriteLine("Error, need data");
        return;
    } catch(InvalidOperationException) {
        reader = Console.In;
    }
}

Process(reader);

不太喜欢使用异常来实现这样的流程,但是......呃。


快速而肮脏的方法是将 Console.KeyAvailable 包装在 try/catch 中,如果抛出异常,您就知道输入是从文件重定向的。当您找不到合适的方法来为您进行检查时,使用 try/catch 来检测状态并不罕见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 C# 中的标准输入 的相关文章

随机推荐