2010-12-11 10 views
5
programmieren verrohrt

ich eine C# Konsolenanwendung zu schreiben, die zwei Parameter verwendet: myprogram.exe param1 param2C# - Console.In.ReadToEnd() hängt von der Benutzereingabe, wenn keine Daten

param2 ist optional, und die Idee ist, wenn es ist nicht vorhanden, verrohrt Daten erhalten:

echo "hithere" | myprogram.exe param1 

ich diesen Teil der Arbeit gemacht habe durch Console.In.ReadToEnd() Erfassung, wenn nur 1 Parameter übergeben wird.

Das Problem, das ich bin Bewurf ist, wenn nur 1 Parameter übergeben wird und keine Daten geleitet werden, es gibt nur sitzt auf Benutzereingaben zu hören und den einzigen Weg ist, zu schließen, um Ctrl+C das Programm zu beenden.

Gibt es eine Möglichkeit, einen Fehler zurückzugeben und das Programm zu beenden, wenn nur 1 Parameter angegeben wurde und keine Daten gesendet wurden?


Um zu testen, ob es etwas warten, ich habe versucht mit:

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

Das hat nicht funktioniert.

Ich habe auch den 'Hack' am Ende dieser Stackoverflow Frage ausprobiert: C# Console receive input with pipe.

Irgendwelche Ideen?

+3

Wenn du deine Frage so umformest, dass sie nicht wie eine Textwand aussieht, denke ich, dass du mehr Leute dazu bringen wirst, sie zu lesen. –

+0

Ich stimme Mark zu, es ist ein echter Schmerz zu lesen ... –

+0

Ich habe es jetzt neu formatiert. Ich hoffe, das ist weniger beängstigend zu lesen. – Matt

Antwort

2

Überprüfen Sie nicht die Konsole, überprüfen Sie die Befehlszeile. Wenn sie genügend Argumente übergeben, dann nehmen wir an, dass es nichts gibt, was man von der Konsole bekommen kann. Wenn sie nicht genügend Parameter angeben, dann nehmen wir an, dass die URL von der Konsole kommen wird. Sie müssen ReadToEnd() nicht verwenden, verwenden Sie stattdessen ReadLine(), damit Sie Zeile für Zeile gehen können. Wenn Sie ReadToEnd() verwenden, müssen Sie STRG + Z (oder STRG + D in Linux) drücken, um das Ende des Eingabestreams anzuzeigen.

+0

Ich überprüfe die Console.In nicht, wenn sie genug Parameter geliefert haben. Gibt es keine Möglichkeit, zu erkennen, ob Daten weitergeleitet wurden oder nicht, und sofort zu beenden, ohne dass der Benutzer STRG + Z eingeben muss? – Matt

+0

Nein, Sie müssen den Benutzer über eine neue Zeile (mit 'ReadLine()') oder STRG + Z (mit 'ReadToEnd()') handeln. –

0

Sie könnten das folgende Programm zu überprüfen, wenn Standard zu sehen, umgeleitet wird:

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

Verbrauch:

bool inputRedirected = ConsoleEx.IsInputRedirected; 

Dann sind Sie für die Anzahl der Befehlszeilenparameter:

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