如何确定Console.Out是否已重定向到文件?

时间:2009-04-13 13:27:03

标签: c# .net console

如果我的程序正在打印到控制台,我会根据Console.WindowWidth通过插入换行符以某种方式执行自动换行 - 这样做非常有效。

但是,如果程序的输出被重定向到文件或其他程序,我希望它跳过自动换行。如何检测到这种情况?

Console.WindowWidth在两种情况下都返回相同的数字。

如果解决方案可以区分重定向的Console.Out和重定向的Console.Error,则

奖励点。

6 个答案:

答案 0 :(得分:12)

.NET 4.5添加了Console.IsOutputRedirectedConsole.IsErrorRedirected

答案 1 :(得分:11)

p / invoke GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)),或调用像GetConsoleScreenBufferInfo这样无害的控制台函数来检查无效的句柄错误。如果您想了解标准错误,请使用STD_ERROR_HANDLE。我相信您甚至可以比较GetStdHandle(STD_OUTPUT_HANDLE)GetStdHandle(STD_ERROR_HANDLE)返回的句柄来检测2>&1之类的内容。

答案 2 :(得分:8)

虽然这有点阴暗并且可能无法保证可行,但您可以试试这个:

bool isRedirected;

try
{
    isRedirected = Console.CursorVisible && false;
}
catch
{
    isRedirected = true;
}

调用CursorVisible会在重定向控制台时抛出异常。

答案 3 :(得分:2)

你需要使用反射 - 有点肮脏,但以下将起作用:

static bool IsConsoleRedirected()
{
    var writer = Console.Out;
    if (writer == null || writer.GetType ().FullName != "System.IO.TextWriter+SyncTextWriter") return true;
    var fld = writer.GetType ().GetField ("_out", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fld == null) return true;
    var streamWriter = fld.GetValue (writer) as StreamWriter;
    if (streamWriter == null) return true;
    return streamWriter.BaseStream.GetType ().FullName != "System.IO.__ConsoleStream";
}

答案 4 :(得分:0)

为什么输出包装在重定向文件中?控制台所做的包装不是通过换行符。换句话说,这个字符串:

  

你好,我的名字是Andrew Hare

会像这样包装在一个瘦的控制台中:

  你好,我的南   e是安德鲁   野兔

但如果你要将输出重定向到一个文件,它将被写成:

  

你好,我的名字是Andrew Hare

因为输出中没有真正的换行符。

答案 5 :(得分:0)

不要那样做!只需传递一个额外的命令行参数,该参数指定要应用的格式。使用您的应用的人和将使用您的代码的人都会更简单,更清晰,更容易理解。