【问题标题】:Detect redirect standard output to nul检测将标准输出重定向到 nul
【发布时间】:2015-01-06 08:39:25
【问题描述】:

我写了一个控制台程序 我想检测用户是否使用重定向

我发现 ConsoleEx 类可以满足我的要求,除了用户将输出流重定向到 NUL 设备
有没有办法区分用户是否将输出重定向到 NUL?

比如我的应用命名为 test.exe
ConsoleEx.IsOutputRedirected 返回 true

test.exe > 001.txt

ConsoleEx.IsOutputRedirected 返回 false

test.exe > NUL
测试.exe

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)); }
    }

    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);
}

【问题讨论】:

    标签: c# redirect output


    【解决方案1】:

    您引用的函数 originally by Hans Passant 已添加到 .NET 4.5 的控制台中(参见 Console.IsOutputRedirected 等)

    有趣的是,.NET 中的实现 能够检测到 NUL 的重定向。它通过在 FileType 检查结果为 false 时进行额外检查来做到这一点:

    int mode;
    bool success = Win32Native.GetConsoleMode(ioHandle, out mode);
    return !success;
    

    如果您使用的是 .NET 4.5,只需使用内置函数即可。如果没有,复制这个额外的检查应该可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2016-04-26
      • 1970-01-01
      相关资源
      最近更新 更多