Как обнаружить если Консоль. В (stdin) был перенаправлен?

Я хочу записать консольное приложение, которые имеют другое поведение, зависящее, если вход прибывает из клавиатуры или из, скажем, файла.

Действительно ли это возможно? Что самый изящный путь состоит в том, чтобы сделать это в C#?

25
задан jpbochi 10 August 2010 в 20:38
поделиться

1 ответ

Вы можете узнать это, вызвав функцию Windows FileType () API. Вот вспомогательный класс:

using System;
using System.Runtime.InteropServices;

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

    // P/Invoke:
    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);
}

Использование:

bool inputRedirected = ConsoleEx.IsInputRedirected;

ОБНОВЛЕНИЕ: эти методы были добавлены в класс консоли в .NET 4.5. Без указания авторства я мог бы добавить :( Просто используйте соответствующий метод вместо этого вспомогательного класса.

https://msdn.microsoft.com/en-us/library/system.console.isoutputredirected.aspx https: / /msdn.microsoft.com/en-us/library/system.console.isinputredirected.aspx ] https://msdn.microsoft.com/en-us/library/system.console.iserrorredirected.aspx

49
ответ дан 28 November 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: