我有一个用C#编写的控制台应用程序,它处理一些数据然后打印结果。在结果可用之前,会有一些动画(/ - \ |)和进度百分比(xx%)不断更新。
显然,如果用户重定向我的应用程序的输出,则会将其打印到输出重定向到的文本文件中。如果可能的话,我想避免这种情况。
那么有没有办法检测我的应用程序的输出是否被重定向? 我正在考虑在使用指定参数运行时仅显示进度指示器,但我希望有人会对我有一个好的答案。
答案 0 :(得分:12)
从.NET Framework 4.5开始,您可以使用Console.IsOutputRedirected
property来检测此内容。
还有Console.IsErrorRedirected
。
答案 1 :(得分:7)
事实证明,它很快将以优雅和跨平台的方式提供: link
答案 2 :(得分:5)
您可以使用本机方法GetConsoleMode来查看stdout是否要转到控制台。
WriteConsole的文档中的评论建议使用此方法:
...确定输出句柄是否是控制台句柄(一种方法是调用GetConsoleMode函数并检查它是否成功)...
答案 3 :(得分:3)
你做不到。重定向输出完全和完全超出了执行程序的范围。你可以然后添加一个命令行选项来禁用你的漂亮输出,这样它也可以被重定向。
编辑:您可以(现在)...... 使用.NET 4.5(参见Matt Brooks' answer)。
答案 4 :(得分:3)
我不会尝试确定内容是否被重定向,而是使用Console.WriteLine(或Console.Out.WriteLine)打印结果,并使用Console.Error.Write进行状态更新。屏幕输出将正确显示但不会反映在文本文件中。
答案 5 :(得分:2)
可能你可以试试这个:
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。 这适合我。 :)
答案 6 :(得分:0)
Console.Write("whatever")
(和WriteLine)实际上将数据写入Console.Out
后面的流。
要始终在控制台上显示进度条而不将其写入文件,无论输出是否重定向到文件,请改为使用错误流:
Console.Error.Write("<your progress bar>");
当应用程序使用&gt;重定向输出时运算符(DIR C:\*.*>MORE
),只有Console.Out
被重定向而不是Console.Error