console.cs IsHandle重定向的奇数

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此后可能依赖于失败?)。


对于为什么以这种方式编写代码的任何见解,将不胜感激。谢谢。


一只萌萌小番薯
浏览 136回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP