Как я могу определить, был ли Console.Out перенаправлен в файл? - PullRequest
15 голосов
/ 13 апреля 2009

Если моя программа печатает на консоль, я выполняю перенос слов определенным образом в соответствии с Console.WindowWidth, вставляя символы новой строки - и это прекрасно работает.

Однако, если выходные данные программы перенаправляются в файл или другую программу, я бы хотел, чтобы она пропускала перенос слов. Как я могу определить, когда это так?

Console.WindowWidth возвращает одинаковое число в обоих случаях.

Бонус очков, если решение может отличить перенаправленный Console.Out от перенаправленного Console.Error.

Ответы [ 6 ]

12 голосов
/ 28 февраля 2013

.NET 4.5 добавляет Console.IsOutputRedirected и Console.IsErrorRedirected.

11 голосов
/ 13 апреля 2009

p / invoke GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)), или вызовите безвредную консольную функцию, такую ​​как GetConsoleScreenBufferInfo, чтобы проверить наличие недопустимой ошибки дескриптора. Если вы хотите узнать о стандартной ошибке, используйте STD_ERROR_HANDLE. Я полагаю, что вы даже можете сравнить дескрипторы, возвращаемые GetStdHandle(STD_OUTPUT_HANDLE) и GetStdHandle(STD_ERROR_HANDLE), чтобы обнаружить такие вещи, как 2>&1.

8 голосов
/ 13 апреля 2009

Хотя это немного затенено и, вероятно, не гарантированно работает, вы можете попробовать это:

bool isRedirected;

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

Вызов CursorVisible вызывает исключение при перенаправлении консоли.

2 голосов
/ 13 апреля 2009

Вам нужно использовать отражение - немного грязно, но будет работать следующее:

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";
}
0 голосов
/ 13 апреля 2009

Не делай этого! Просто передайте дополнительный параметр командной строки, который определяет форматирование, которое вы хотите применить. Это проще, чище и легче понять как людям, которые будут использовать ваше приложение, так и людям, которые будут работать над вашим кодом.

0 голосов
/ 13 апреля 2009

Почему вывод переносится в перенаправленном файле? Обтекание, которое делает консоль, не посредством разрывов строки. Другими словами эта строка:

привет, меня зовут Эндрю Хэйр

обернул бы в тощую консоль вот так:

привет, мой род
Эндрю
Hare

но если бы вы перенаправили вывод в файл, он был бы написан так:

привет, меня зовут Эндрю Хэйр

, поскольку на выходе нет истинных разрывов строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...