2012-01-26 11 views
10

Mam app konsoli, który musi włączyć lub wyłączyć niektóre operacje, gdy wyjście jest przekierowywane (zewnętrznie) do pliku lub rury (MojaAplik.exe> ​​foo.bar)Jak sprawdzić, czy moja aplikacja konsoli Delphi jest przekierowywana do pliku lub potoku?

Jak mogę sprawdzić, czy moja aplikacja konsoli Delphi jest przekierowywany do pliku lub rury?

+0

możliwe duplikat [Jak wykryć, czy Console.In (stdin) został przekierowany?] (Http://stackoverflow.com/questions/3453220/how-to-detect-if-console-in- stdin-has-been-diirected) –

Odpowiedz

12

można korzystać z funkcji GetStdHandle i GetFileType.

najpierw pobrać uchwyt wyjścia konsoli przy użyciu funkcji GetStdHandle i wtedy można sprawdzić rodzaj uchwytu z funkcją 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. 
+3

Dokumentacja wspomina, że ​​'File_Type_Char' jest" zwykle urządzeniem LPT lub konsolą ", więc ta metoda może nie powiedzieć, kiedy dane wyjściowe twojego programu są przekierowywane do drukarki:' myapp.exe> ​​LPT1'. –

+2

Rzeczywiście, ale operacja op pyta konkretnie o '..jest przekierowany do pliku lub potoku..' tak, aby mógł użyć' Result: = (FileType = FILE_TYPE_PIPE) lub (FileType = FILE_TYPE_DISK); 'kod, który jest skomentowany w mojej odpowiedzi. – RRUZ

+0

@RRUZ Bardziej prawdopodobne były to pierwsze dwa rodzaje przekierowań, które pojawiły się w jego głowie. A jeśli w to właśnie wierzysz, nie wiem, dlaczego skomentowałeś tę wersję. –

9

Podejście, które tu prezentuję, wydaje się być hacky, ale nie mogę znaleźć lepszego sposobu na wykrycie, czy standardowe wyjście zostało przekierowane z konsoli ekranowej. Podejście z użyciem GetFileType nie może wykryć wszystkich form przekierowania, ponieważ niektóre przekierowania dotyczą urządzeń typu FILE_TYPE_CHAR.


połączeń GetConsoleMode() przechodząc standardowego uchwytu wyjściowego. Jeśli zawiedzie GetConsoleMode(), Twoja konsola została przekierowana.

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. 
+1

Co się stanie, jeśli 'GetConsoleMode' zawiedzie w trybie konsoli z powodu praw dostępu na przykład? – kobik

+2

@kobik Gra kończy się, jeśli nie masz dostępu do swojej własnej konsoli !! –

+2

o co proszę, jeśli to stwierdzenie jest faktem: "Jeśli funkcja GetConsoleMode() nie powiedzie się, twoja konsola została przekierowana". – kobik

Powiązane problemy