2010-12-11 12 views
5

Sto scrivendo un C# applicazione console che prende 2 parametri: myprogram.exe param1 param2C# - Console.In.ReadToEnd() si blocca su input dell'utente, se non ci sono dati in filodiffusione per programmare

param2 è facoltativo, e l'idea è che se non è presente, ottenere i dati in filodiffusione:

echo "hithere" | myprogram.exe param1 

ho fatto questo lavoro parte catturando Console.In.ReadToEnd() quando viene passato solo 1 parametro.

Il problema che sto affrontando è quando solo 1 parametro viene passato e nessun dato viene convogliata, ma appena ci si siede ad ascoltare l'input dell'utente e l'unico modo per chiudere è quello di Ctrl+C per terminare il programma.

Invece, c'è un modo per restituire un errore e uscire dal programma se solo 1 parametro è stato fornito e nessun dato è stato convogliato?


Per testare se c'è qualcosa di attesa, ho provato ad utilizzare:

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

che non ha funzionato.

Ho anche provato il 'incidere' menzionato in fondo a questa domanda StackOverflow: C# Console receive input with pipe.

Qualche idea?

+3

Se riformattate la vostra domanda in modo che non sembri un muro di testo, penso che otterrete più persone a leggerlo. –

+0

Sono d'accordo con Mark, è un vero e proprio dolore per leggere ... –

+0

ho riformattato ora. Spero che sia meno scoraggiante da leggere. – Matt

risposta

2

Invece di controllare la console, controllare la linea di comando. Se passano abbastanza argomenti, allora supponi che non ci sia nulla da ottenere dalla console. Se non specificano parametri sufficienti, supponiamo che l'URL arriverà dalla console. Non è necessario utilizzare ReadToEnd(), basta usare ReadLine() invece così si può andare riga per riga. Se si utilizza ReadToEnd() dovrete premere CTRL + Z (o CTRL + D in linux) per indicare la fine del flusso di input.

+0

Già non controllo la Console.In se hanno fornito abbastanza parametri. Non esiste un modo per rilevare se i dati sono stati convogliati o meno e uscire immediatamente senza che l'utente inserisca CTRL + Z? – Matt

+0

No, è necessario che l'utente esegua un'azione tramite una nuova riga (usando 'ReadLine()') o CTRL + Z (usando 'ReadToEnd()'). –

0

Si potrebbe il seguente programma per verificare se standard viene reindirizzato:

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

Usage:

bool inputRedirected = ConsoleEx.IsInputRedirected; 

quindi verificare il numero di parametri della riga di comando:

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 
    } 
}