. NET Ядро на Linux: перенаправлен ли стандартный вывод? - PullRequest
0 голосов
/ 21 марта 2020

На Windows, я использую этот код, чтобы определить, перенаправлен ли поток stdout для текущего запущенного процесса:

private static bool? isOutputRedirected;

public static bool IsOutputRedirected
{
    get
    {
        if (isOutputRedirected == null)
        {
            isOutputRedirected =
                GetFileType(GetStdHandle(StdHandle.Output)) != FileType.FileTypeChar ||
                !GetConsoleMode(GetStdHandle(StdHandle.Output), out _);
            // Additional GetConsoleMode check required to detect redirection to "nul"
        }
        return isOutputRedirected == true;
    }
}

private enum StdHandle : int
{
    Input = -10,
    Output = -11,
    Error = -12,
}

private enum FileType : uint
{
    FileTypeChar = 0x0002,
    FileTypeDisk = 0x0001,
    FileTypePipe = 0x0003,
    FileTypeRemote = 0x8000,
    FileTypeUnknown = 0x0000,
}

[DllImport("kernel32.dll")]
private static extern FileType GetFileType(IntPtr hFile);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(StdHandle nStdHandle);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);

У меня есть аналогичные свойства для двух других стандартных потоков.

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

Но это не так, как ожидалось при работе на Linux (dotnet publish -r linux-arm).

Как я могу определить ту же ситуацию на Linux? Похоже, что сеть ничего об этом не знает (пока).

1 Ответ

0 голосов
/ 21 марта 2020

Для. NET Framework 4.5 и выше, вы можете посмотреть на Console.IsOutputRedirected и Console.IsErrorRedirected

source: https://docs.microsoft.com/en-us/dotnet/api/system.console?view=netcore-3.1

...