2010-12-11 7 views
5

Estoy escribiendo una aplicación de consola de C# que toma 2 parámetros: myprogram.exe param1 param2C# - Console.In.ReadToEnd() se cuelga en la entrada del usuario, si no hay datos de hilo para programar

param2 es opcional, y la idea es que si no es presente, obtener datos entubada:

echo "hithere" | myprogram.exe param1 

he hecho este trabajo parte mediante la captura de Console.In.ReadToEnd() cuando se pasa a sólo 1 parámetro.

El problema al que me enfrento es cuando solo se pasa 1 parámetro y no se canalizan datos, simplemente se sienta allí escuchando la entrada del usuario y la única manera de cerrar es Ctrl+C para finalizar el programa.

En su lugar, ¿hay alguna forma de devolver un error y salir del programa si solo se proporcionó 1 parámetro y no se transmitieron datos?


Para probar si hay algo esperando, He intentado usar:

  • Console.OpenStandardInput().CanRead
  • Console.OpenStandardInput().Length
  • Console.In.Peek()

eso no funcionó.

También probé el 'hack' mencionado en la parte inferior de esta pregunta de stackoverflow: C# Console receive input with pipe.

¿Alguna idea?

+3

Si vuelve a formatear su pregunta para que no se vea como un muro de texto, creo que conseguirá que más personas lo lean. –

+0

Estoy de acuerdo con Mark, es un verdadero dolor leer ... –

+0

Lo he reformateado ahora. Espero que sea menos intimidante leerlo. – Matt

Respuesta

2

En lugar de verificar la consola, verifique la línea de comando. Si envían suficientes argumentos, suponga que no hay nada que obtener de la consola. Si no especifican suficientes parámetros, suponga que la URL va a proceder de la consola. No necesita usar ReadToEnd(), simplemente use ReadLine() para que pueda ir línea por línea. Si usa ReadToEnd(), tendrá que presionar CTRL + Z (o CTRL + D en Linux) para indicar el final de la secuencia de entrada.

+0

Ya no compruebo la consola. En caso de que hayan suministrado suficientes parámetros. ¿No hay forma de detectar si los datos se canalizaron o no y salir inmediatamente sin que el usuario ingrese CTRL + Z? – Matt

+0

No, necesita que el usuario actúe a través de una nueva línea (usando 'ReadLine()') o CTRL + Z (usando 'ReadToEnd()'). –

0

Podría el programa siguiente para comprobar si estándar en se redirige:

using System; 
using System.Runtime.InteropServices; 

public static class ConsoleEx { 
    public static bool IsOutputRedirected { 
    get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdout)); } 
    } 
    public static bool IsInputRedirected { 
    get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdin)); } 
    } 
    public static bool IsErrorRedirected { 
    get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stderr)); } 
    } 

    // P/Invoke: 
    private enum FileType { Unknown, Disk, Char, Pipe }; 
    private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 }; 
    [DllImport("kernel32.dll")] 
    private static extern FileType GetFileType(IntPtr hdl); 
    [DllImport("kernel32.dll")] 
    private static extern IntPtr GetStdHandle(StdHandle std); 
} 

Uso:

bool inputRedirected = ConsoleEx.IsInputRedirected; 

A continuación, compruebe si el número de parámetros de línea de comandos:

if (args.Length < 1) 
# No parameters were passed 
if (args.Length < 2) 
{ 
    if (!inputRedirected) 
    { 
     Console.Error.WriteLine("You must redirect from stdin"); 
     # exit/die/end here 
    } 
} 
Cuestiones relacionadas