Search code examples
c#consolehttp-redirectstdin

How to detect if Console.In (stdin) has been redirected?


I want to write a console application that have a different behavior depending if the input is coming from keyboard or from, say, a file.

Is it possible? What's the most elegant way to do it in C#?


Solution

  • You can find out by p/invoking the Windows FileType() API function. Here's a helper class:

    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;
    

    UPDATE: these methods were added to the Console class in .NET 4.5. Without attribution I might add :( Simply use the corresponding method instead of this helper class.

    https://msdn.microsoft.com/en-us/library/system.console.isoutputredirected.aspx https://msdn.microsoft.com/en-us/library/system.console.isinputredirected.aspx https://msdn.microsoft.com/en-us/library/system.console.iserrorredirected.aspx