检查输出是否重定向
我有一个用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