Как проверить, перенаправлено ли мое консольное приложение Delphi в файл или канал? - PullRequest
10 голосов
/ 26 января 2012

У меня есть консольное приложение, которое должно отключать или включать некоторые операции, когда вывод перенаправляется (извне) в файл или канал (myapp.exe> ​​Foo.bar)

Как проверить, работает ли моя консоль Delphiприложение перенаправлено в файл или канал?

Ответы [ 2 ]

12 голосов
/ 26 января 2012

Вы можете использовать функции GetStdHandle и GetFileType.

сначала вы получаете дескриптор вывода консоли с помощью функции GetStdHandle, а затем вы можете проверить тип дескриптора с помощью функции GetFileType.

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows,
  SysUtils;


function ConsoleRedirected: Boolean;
var
  FileType : DWORD;
begin
  FileType:= GetFileType(GetStdHandle(STD_OUTPUT_HANDLE));
  Result  := (FileType=FILE_TYPE_PIPE) or (FileType=FILE_TYPE_DISK);
end;


begin
  try
    if ConsoleRedirected then
      Writeln('Hello From File')
    else
      Writeln('Hello Console');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
9 голосов
/ 26 января 2012

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


Позвоните GetConsoleMode(), передав стандартную ручку вывода. В случае сбоя GetConsoleMode() ваша консоль была перенаправлена.

program RedirectionDetection;
{$APPTYPE CONSOLE}
uses
  Windows;

function ConsoleRedirected: Boolean;
var
  Mode: DWORD;
begin
  Result := not GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), Mode);
end;

begin
  if ConsoleRedirected then begin
    Writeln('I have been redirected');
  end else begin
    Writeln('I am a console');
    Readln;
  end;
end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...