猿问
下载APP

如何检测Console.In(stdin)是否已被重定向?

如何检测Console.In(stdin)是否已被重定向?

我想编写一个具有不同行为的控制台应用程序,具体取决于输入是来自键盘还是来自文件。

可能吗?在C#中最优雅的方法是什么?


呼啦一阵风
浏览 49回答 3
3回答

呼唤远方

您可以通过p /调用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/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

若吾皇

有趣的是,当一个管道打开时,System.Console.WindowHeight和System.Console.WindowWidth参数为零,我发现这是由于ArgumentOutOfRangeException代码路径中的几个不关心控制台大小为零。Crossplatform:在Linux和Windows上的MS dotNET和Mono下的行为是相同的(我还没有在Mac上尝试过)。当管道传输STDIN或STDOUT时,控制台大小设置为0.因此在Hans的实现基础上,我的代码如下:using System;  public static class ConsoleEx {         public static bool IsConsoleSizeZero {             get {                 try {                     return (0 == (Console.WindowHeight + Console.WindowWidth));                 }                 catch (Exception exc){                     return true;                 }             }         }         public static bool IsOutputRedirected {             get { return IsConsoleSizeZero && !Console.KeyAvailable; }         }         public static bool IsInputRedirected {             get { return IsConsoleSizeZero && Console.KeyAvailable; }         }}2016年更新:为IsConsoleSizeZero代码添加了异常处理,以在更广泛的环境中提高代码的可用性。代码似乎仍然运行良好,至少从使用MonoDevelop / Xamarin Studio时的经验来讲。相关:MSDN:KeyAvailable设置System.Console.WindowHeight会在Mono下抛出System.NotSupportedException。

123456qqq

由于框架4.5存在属性Console.IsInputRedirected。8-)请参阅MSDNhttps://msdn.microsoft.com/de-de/library/system.console.isinputredirected(v=vs.110).aspx
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答