MS自己的console.cs具有以下功能,由IsInput / Output / ErrorRedirected API使用。
private static bool IsHandleRedirected(IntPtr ioHandle) {
// Need this to use GetFileType:
SafeFileHandle safeIOHandle = new SafeFileHandle(ioHandle, false);
// If handle is not to a character device, we must be redirected:
int fileType = Win32Native.GetFileType(safeIOHandle);
if ((fileType & Win32Native.FILE_TYPE_CHAR) != Win32Native.FILE_TYPE_CHAR) // <--- ??
return true;
// We are on a char device.
// If GetConsoleMode succeeds, we are NOT redirected.
int mode;
bool success = Win32Native.GetConsoleMode(ioHandle, out mode);
return !success;
}
我不明白(由我自己)标记的那一行的逻辑// <--- ??。,这是有道理的if (fileType != Win32Native.FILE_TYPE_CHAR) return true;,但是& Win32Native.FILE_TYPE_CHAR在进行比较之前,我不明白为什么它被掩盖了。
更令人困惑的FILE_TYPE_CHAR是,常量是0x0002也由共享的单个位FILE_TYPE_PIPE = 0x0003,因此,如果文件句柄指向管道,则所if讨论的语句将不会return true;(GetConsoleMode此后可能依赖于失败?)。
对于为什么以这种方式编写代码的任何见解,将不胜感激。谢谢。
相关分类