Comment vérifier si mon application de console Delphi est redirigée vers un fichier ou un tube?

J’ai une application de console qui doit désactiver ou activer certaines opérations lorsque la sortie est redirigée (en externe) vers un fichier ou un tube (myapp.exe> ​​Foo.bar)

Comment puis-je vérifier si mon application de console Delphi est redirigée vers un fichier ou un tube?

vous pouvez utiliser les fonctions GetStdHandle et GetFileType .

D’abord, vous récupérez le handle de sortie de la console à l’aide de la fonction GetStdHandle, puis vous pouvez vérifier le type du handle avec la fonction 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. 

L’approche que je vous présente ici semble hackée mais je ne trouve pas de meilleur moyen de détecter si la sortie standard a été ou non redirigée depuis une console d’écran. L’approche utilisant GetFileType ne peut pas détecter toutes les formes de redirection car certaines redirections concernent des périphériques de type FILE_TYPE_CHAR .


Appelez GetConsoleMode() passant le handle de sortie standard. Si GetConsoleMode() échoue, votre console a été redirigée.

 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.