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#?
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#?
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 OutputRedirected {
get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdout)); }
}
public static bool InputRedirected {
get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdin)); }
}
public static bool ErrorRedirected {
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.InputRedirected;