我正在编写一个小型命令行实用程序,其目的是解析另一个实用程序的输出。我希望它可以通过两种方式调用:
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);
不太喜欢使用异常来实现这样的流程,但是......呃。