检查输出是否重定向

我有一个用C#编写的控制台应用程序,它处理一些数据然后打印结果。 在结果可用之前,会有一些动画(/ – \ |)和进度百分比(xx%)不断更新。

显然,如果用户重定向我的应用程序的输出,它将被打印到输出被重定向到的文本文件中。 如果可能的话我想避免这种情况。

那么有没有办法检测我的应用程序的输出是否被重定向? 我正在考虑在使用指定参数运行时仅显示进度指示器,但我希望有人会对我有一个好的答案。

你不能。 重定向输出完全和完全超出了执行程序的范围。 但是,您可以添加一个命令行选项来禁用您的漂亮输出,以便它也可以重定向。

编辑:你可以(现在)……从.NET 4.5开始(参见Matt Brooks的回答 )。

从.NET Framework 4.5开始,您可以使用Console.IsOutputRedirected属性来检测它。

还有Console.IsErrorRedirected

事实certificate,它很快将以优雅和跨平台的方式提供: 链接 。

您可以使用本机方法GetConsoleMode来查看stdout是否转到控制台。

WriteConsole文档中的备注建议使用此方法:

…确定输出句柄是否是控制台句柄(一种方法是调用GetConsoleMode函数并检查它是否成功)…

我不是试图确定内容是否被重定向,而是使用Console.WriteLine(或Console.Out.WriteLine)打印结果,使用Console.Error.Write进行状态更新。 屏幕输出将正确显示但不会反映在文本文件中。

也许你可以试试这个:

 public enum FileType : uint { FILE_TYPE_UNKNOWN = 0x0000, FILE_TYPE_DISK = 0x0001, FILE_TYPE_CHAR = 0x0002, FILE_TYPE_PIPE = 0x0003, FILE_TYPE_REMOTE = 0x8000, } public enum STDHandle : uint { STD_INPUT_HANDLE = unchecked((uint)-10), STD_OUTPUT_HANDLE = unchecked((uint)-11), STD_ERROR_HANDLE = unchecked((uint)-12), } [DllImport("Kernel32.dll")] static public extern UIntPtr GetStdHandle(STDHandle stdHandle); [DllImport("Kernel32.dll")] static public extern FileType GetFileType(UIntPtr hFile); static public bool IsOutputRedirected() { UIntPtr hOutput = GetStdHandle(STDHandle.STD_OUTPUT_HANDLE); FileType fileType = (FileType)GetFileType(hOutput); if (fileType == FileType.FILE_TYPE_CHAR) return false; return true; } 

如果未重定向标准输出,则GetFileType()的输出应为0x0002。 这对我有用。 🙂

Console.Write("whatever") (和WriteLine)实际上将数据写入Console.Out后面的流。 要始终在控制台上显示进度条而不将其写入文件,无论输出是否重定向到文件,请使用错误流:

Console.Error.Write("");

当应用程序使用>运算符( DIR C:\*.*>MORE )重定向输出时,仅重定向Console.Error而不是Console.Error