我想编写一个控制台应用程序,该应用程序具有不同的行为,具体取决于输入是来自键盘还是来自文件。
可能吗?在C#中最优雅的方法是什么?
您可以通过调用Windows FileType()API函数来查找。这是一个帮助器类:
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); }
用法:
bool inputRedirected = ConsoleEx.IsInputRedirected;
更新:这些方法已添加到.NET 4.5中的Console类中。没有署名,我可能会添加:(只需使用相应的方法而不是此帮助器类。
https://msdn.microsoft.com/zh- CN/library/system.console.isoutputredirected.aspx https://msdn.microsoft.com/en- us/library/system.console.isinputredirected.aspx https:// msdn.microsoft.com/zh- CN/library/system.console.iserrorredirected.aspx