How do I check if my Delphi console app is redirected to a file or pipe?

后端 未结 2 572
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-09 11:56

I have a console app that must disable or enable some operations when output is redirected (externally) to a file or pipe (myapp.exe > Foo.bar)

How I can check if my

相关标签:
2条回答
  • 2020-12-09 12:26

    The approach I present here feels hacky but I can't find a better way to detect whether or not the standard output has been redirected away from a screen console. The approach using GetFileType cannot detect all forms of redirection since some redirections are to devices of type FILE_TYPE_CHAR.


    Call GetConsoleMode() passing the standard output handle. If GetConsoleMode() fails then your console has been redirected.

    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.
    
    0 讨论(0)
  • 2020-12-09 12:51

    you can use the GetStdHandle and GetFileType functions.

    first you retrieve the console output handle using the GetStdHandle function and then you can check the type of the handle with the GetFileType function.

    {$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.
    
    0 讨论(0)
提交回复
热议问题