Ich habe eine Konsolenanwendung in C # geschrieben, die einige Daten verarbeitet und dann die Ergebnisse ausgibt. Bis die Ergebnisse verfügbar sind, gibt es eine kleine Animation (/ - \ |) und Fortschrittsprozentsatz (xx%), der ständig aktualisiert wird.
Wenn der Benutzer die Ausgabe meiner Anwendung umleitet, wird dies offensichtlich in die Textdatei gedruckt, in die die Ausgabe umgeleitet wird. Wenn möglich, möchte ich das vermeiden.
Gibt es also eine Möglichkeit festzustellen, ob die Ausgabe meiner Anwendung umgeleitet wird? Ich denke darüber nach, nur die Fortschrittsanzeigen anzuzeigen, wenn ich mit einem bestimmten Parameter arbeite, aber ich hoffe, dass jemand eine gute Antwort für mich hat.
Sie können nicht. Umgeleitete Ausgabe liegt vollständig und vollständig außerhalb des ausführenden Programms. Sie können jedoch eine Befehlszeilenoption hinzufügen, um Ihre hübsche Ausgabe zu deaktivieren, sodass sie auch umgeleitet werden kann.
BEARBEITEN: Sie können (jetzt) ... mit .NET 4.5 (siehe Matt Brooks ') Antwort ).
Ab .NET Framework 4.5 können Sie das verwenden Console.IsOutputRedirected
-Eigenschaft , um dies zu erkennen.
Es gibt auch Console.IsErrorRedirected
.
Wie sich herausstellt, wird es bald auf elegante und plattformübergreifende Weise verfügbar sein: link .
Sie können die native Methode GetConsoleMode verwenden, um zu sehen, ob stdout geht zu einer Konsole oder nicht.
Diese Methode wird von den Anmerkungen in der Dokumentation für WriteConsole vorgeschlagen:
... bestimmen, ob das Ausgabehandle ein Konsolenhandle ist (eine Methode besteht darin, die GetConsoleMode-Funktion aufzurufen und zu überprüfen, ob sie erfolgreich ist) ...
Anstatt zu ermitteln, ob der Inhalt umgeleitet wird, verwende ich Console.WriteLine (oder Console.Out.WriteLine), um Ihre Ergebnisse und Console.Error.Write für Ihre Statusaktualisierungen zu drucken. Die Bildschirmausgabe wird korrekt angezeigt, aber nicht in der Textdatei wiedergegeben.
Console.Write("whatever")
(und WriteLine) schreiben tatsächlich Daten in den Stream hinter Console.Out
.
Um immer einen Fortschrittsbalken auf der Konsole anzuzeigen und ihn nicht in eine Datei zu schreiben, unabhängig davon, ob die Ausgabe in eine Datei umgeleitet wird oder nicht, verwenden Sie stattdessen den Fehlerdatenstrom:
Console.Error.Write("<your progress bar>");
Wenn eine Anwendung die Ausgabe mit dem & gt; operator ( DIR C:\*.*>MORE
), nur Console.Out
wird umgeleitet und nicht Console.Error