Estoy escribiendo una pequeña utilidad de línea de comandos cuyo propósito es analizar el resultado de otra utilidad. Yo quiero que sea invocable de dos maneras:Comprobación de entrada estándar en C#
c:\> myutility filewithoutput.txt
O
c:\> otherutility -args | myutility
Así que, básicamente, estándar o en un argumento de archivo. Mi primer intento en esta era la siguiente:
TextReader reader;
if (args.Length > 1) {
reader = new StreamReader(new FileStream(args[1], FileMode.Open));
} else {
reader = Console.In;
}
Process(reader);
El argumento de archivo funciona bien, y una tubería de la salida de la utilidad a mi utilidad funciona bien, pero si sólo invoca normalmente (sin argumentos ni datos por tubería) , se cuelga O, más bien, se bloquea en espera de leer desde la entrada estándar
Mi segundo proyecto era la siguiente:.
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);
Mientras KeyAvailable
fija el "sin entrada" problema, se produce una excepción si se intenta pipa en los datos> _ <
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
La excepción sugiere que utilizo Console.In.Peek
, por lo que mi próximo proyecto es como tal:
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);
Sin embargo, esto tiene el mismo problema que el primer intento: bloquea, buscando entrada. Argh!
¿Hay algo que me falta?
Nota: Soy consciente de la convención del argumento "-" que significa "uso de entrada estándar". Lo usaré si no hay otra manera. Pero, seguramente, debe haber alguna manera de detectar si el estándar es la consola o no.
Editar: Aquí está la versión final que parece hacer lo que necesito:
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);
No
un gran fan de la utilización de excepciones para el flujo de esa manera, pero ... eh.
¿Es esto relevante? http: // efreedom.com/Question/1-3453220/Detect-ConsoleIn-Stdin-Redirected – bzlm
@bzlm - por qué no enlazar directamente a la fuente (que pasa a ser Stack Overflow): http://stackoverflow.com/questions/3453220 –
@John Oh , por lo que es * mi * culpa que SO no se clasifique como el más alto para los términos de búsqueda que ingresé. :) – bzlm