gpt4 book ai didi

c# - 在 C# 中检查标准输入

转载 作者:可可西里 更新时间:2023-11-01 07:56:14 26 4
gpt4 key购买 nike

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

c:\> myutility filewithoutput.txt

或者,

c:\> otherutility -args | myutility

所以,基本上,标准 in 或文件参数。我的第一次尝试是这样的:

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);

虽然 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);

但是,这与第一次尝试有同样的问题:它阻塞,寻找输入。 啊!

有什么我想念的吗?

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

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

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);

不太喜欢使用 Exceptions 这样的流程,但是......嗯。

最佳答案

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

关于c# - 在 C# 中检查标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com