一尘不染

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

c#

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

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


阅读 237

收藏
2020-05-19

共1个答案

一尘不染

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

2020-05-19