Determinar si la salida estándar está redirigida
Artículo por Club Developers · 01 March 2006
3143 vistas
A veces es útil saber si la ejecución de una aplicación cónsola redirige o no sus entradas/salidas estándars. Para determinar si es el caso, vamos a usar la función Getfiletype que devuelve el tipo del fichero del handle pasado por parámetro:
El tipo devuelto puede ser:
FILE_TYPE_CHAR : indica un tipo de fichero carácter, normalmente una impresora o la cónsola.
FILE_TYPE_DISK : indica un tipo de fichero disco.
FILE_TYPE_PIPE : indica un tipo de fichero socket, una pipe con nombre, o pipe anónima.
FILE_TYPE_REMOTE : no se usa
FILE_TYPE_UNKNOWN : si el tipo de fichero es desconocido o si la función a fallado.
El script siguiente permite visualizar los diferentes casos:
delphi
program TestIO; {$APPTYPE CONSOLE} uses sysutils, Windows; var ConsoleHandle : THandle; Function GetHandleType(Handle:THandle): String; begin case GetFileType(Handle)of FILE_TYPE_UNKNOWN : Result:='tipo desconocido o error.'; FILE_TYPE_DISK : Result:='fichero disco.'; FILE_TYPE_CHAR : Result:='fichero carácter.'; FILE_TYPE_PIPE : Result:='socket, una pipe con nombre, o una pipe anónima.'; //FILE_TYPE_REMOTE no usado end; end; begin ConsoleHandle := GetStdHandle(STD_OUTPUT_HANDLE); WriteLn('Salida estándard : '+ GetHandleType(ConsoleHandle)); Readln; ConsoleHandle := GetStdHandle(STD_INPUT_HANDLE); WriteLn('Entrada estándard : '+ GetHandleType(ConsoleHandle)); end.
El tipo devuelto puede ser:
FILE_TYPE_CHAR : indica un tipo de fichero carácter, normalmente una impresora o la cónsola.
FILE_TYPE_DISK : indica un tipo de fichero disco.
FILE_TYPE_PIPE : indica un tipo de fichero socket, una pipe con nombre, o pipe anónima.
FILE_TYPE_REMOTE : no se usa
FILE_TYPE_UNKNOWN : si el tipo de fichero es desconocido o si la función a fallado.
El script siguiente permite visualizar los diferentes casos:
delphi
@Echo Off Set DirPrgName= Set PrgName=%DirPrgName%TestIO.exe Rem diferentes casos Echo Test con : %PrgName% %PrgName% pause&Echo. Echo Test con : %PrgName%^>Result1.txt %PrgName%>Result1.txt Type Result1.txt pause&Echo. Echo Test con : %PrgName%^|more %PrgName%|more pause&Echo. Echo Test con : %PrgName%^|more^>Result2.txt %PrgName%|more>Result2.txt Type Result2.txt pause&Echo. Echo Test con : %PrgName%^>Result1.txt %PrgName%<Result1.txt pause&Echo. Echo Test con : %PrgName%^<Result1.txt^>Result3.txt %PrgName%<Result1.txt>Result3.txt Type Result3.txt pause&Echo.