检查输出是否重定向

时间:2009-07-23 04:22:30

标签: c# .net redirect console

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

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

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

7 个答案:

答案 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