【发布时间】:2020-03-20 22:03:01
【问题描述】:
在 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 上的相同情况?网络似乎对它一无所知(目前)。
【问题讨论】:
标签: c# linux .net-core console