简体   繁体   中英

How to hide output (not the window) in a console application?

Well, let me make it clear again. I have a console application with many classes, in each class there is at least one Console.WriteLine("text") line. I defined some arguments that when running the application, it output exactly what I wrote in classes. There, I want to define an argument that when I run the app with this argument, there will be no output on the console screen but the console window still appears. The argument maybe something like "-s". So is there any way I can do this without using the "if" condition in each class and passing an parameter through classes? Many thanks.

P/S: I've searched thru the internet and found out some articles related to this, but most of the answers were to hide the console window. I think this question should be what the others meant.

Use Console.SetOut ( http://msdn.microsoft.com/en-us/library/system.console.setout.aspx ) and pass in a "null" text writer. The idea on -s perform a Console.SetOut(new StreamWriter()) .

The example for the Console.SetOut method will help you get started.

In addition, you can easily add logging using this method.

The Console.SetOut method throws a ArgumentNullException if you pass null directly; same for StreamWriter (if you pass a stream or if you pass a string .

What I use is passing the special Stream.Null field to a StreamWriter :

System.Console.SetOut(new System.IO.StreamWriter(System.IO.Stream.Null);

This redirect the stream to what is essentially the null device ( /dev/null on *NIX machines).

Use these methods to redirect output (programmatically):

    Console.SetIn(...);
    Console.SetOut(...);
    Console.SetError(...);
app.exe > nul

redirects output to nowhere. FYI: Using command redirection operators

This worked pretty well for me !:

Console.SetOut(StreamWriter.Null);
Console.SetError(StreamWriter.Null);

This doesn't work:

Console.SetOut(null);
Console.SetError(null);

It results in an ArgumentNullException .

This doesn't work:

Console.SetOut(new StreamWriter(null));
Console.SetError(new StreamWriter(null));

Because it is ambiguous between new StreamWriter(string path) and new StreamWriter(Stream stream) .

And finally , neither of these work:

Console.SetOut(new StreamWriter(default(string)));
Console.SetError(new StreamWriter(default(Stream)));

Because they also result in an ArgumentNullException .

Have you come across Console.Clear() , you could call this in a way that makes it appear no text at all was output.

As for avoiding having to separately define this in each class you should look at inheritance. This allows you to define the functionality in one place and each 'sub' class will inherit this.

You could use log4net to define the items you want to log. It allows you to log regarding log level, regarding which class you want to log and so on.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM