检测将标准输出重定向到 nul
Detect redirect standard output to nul
我写了一个控制台程序
我想检测用户是否使用重定向
我发现 ConsoleEx class 可以满足我的要求,除了用户将输出流重定向到 NUL 设备
有没有办法区分用户是否将输出重定向到 NUL?
比如我的应用命名test.exe
ConsoleEx.IsOutputRedirected return 真
test.exe > 001.txt
ConsoleEx.IsOutputRedirected return 错误
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);
}
您引用的函数,originally by Hans Passant, was added to the console in .NET 4.5 (see Console.IsOutputRedirected 等)
有趣的是,.NET 中的实现 能够检测到 NUL 的重定向。每当 FileType 检查结果为 false 时,它都会进行额外的检查:
int mode;
bool success = Win32Native.GetConsoleMode(ioHandle, out mode);
return !success;
如果您使用的是 .NET 4.5,只需使用内置函数即可。如果没有,重复这个额外的检查应该可以解决你的问题。
我写了一个控制台程序 我想检测用户是否使用重定向
我发现 ConsoleEx class 可以满足我的要求,除了用户将输出流重定向到 NUL 设备
有没有办法区分用户是否将输出重定向到 NUL?
比如我的应用命名test.exe
ConsoleEx.IsOutputRedirected return 真
test.exe > 001.txt
ConsoleEx.IsOutputRedirected return 错误
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);
}
您引用的函数,originally by Hans Passant, was added to the console in .NET 4.5 (see Console.IsOutputRedirected 等)
有趣的是,.NET 中的实现 能够检测到 NUL 的重定向。每当 FileType 检查结果为 false 时,它都会进行额外的检查:
int mode;
bool success = Win32Native.GetConsoleMode(ioHandle, out mode);
return !success;
如果您使用的是 .NET 4.5,只需使用内置函数即可。如果没有,重复这个额外的检查应该可以解决你的问题。