检测重定向标准输出为nul

时间:2015-01-06 08:39:26

标签: c# redirect output

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

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

例如,我的应用程序命名test.exe
ConsoleEx.IsOutputRedirected返回true

test.exe> 001.txt

ConsoleEx.IsOutputRedirected返回false

test.exe> NUL
TEST.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);
}

1 个答案:

答案 0 :(得分:2)

您引用的函数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,只需使用内置函数即可。如果没有,复制这个额外的检查应该可以解决您的问题。