我使用redmon将postscript重定向到delphi进行处理。
我使用以下代码将stdin读取到文件中:
var
Stdin: THandleStream;
FStream: TFileStream;
BytesRead:Int64;
Buffer: array[0..1023] of Byte;
StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
try
tempps:=GetTempFile('.ps');
FStream:=tfilestream.Create(tempps,fmCreate or fmOpenReadWrite);
StdIn.Seek(0,0);
try
repeat
BytesRead:=StdIn.Read(Buffer,1024);
FStream.Write(Buffer,BytesRead);
until bytesread<SizeOf(Buffer);
finally
InputSize:=FStream.Size;
FStream.Free;
end;
finally
StdIn.Free;
end;这适用于大多数情况,但redmon日志文件显示的情况除外:
REDMON WritePort: OK count=65536 written=65536
REDMON WritePort: Process not running. Returning TRUE.
Ignoring 65536 bytes是因为65536只是一个转移注意力的问题,而是我没有正确地阅读stdin,还是有什么奇怪的限制被我忽略了?
提前谢谢。
编辑1
65536是一个转移注意力的问题- redmon在日志中每64k打印一次此消息,整个文件为688759字节,但是看起来redmon提前关闭了输出,但仍然会继续输出更多的文本。
发布于 2011-12-09 02:18:57
我不知道RedMon是如何工作的,但我不会依赖bytesread<SizeOf(Buffer)作为EOF条件,因为我假设你实际上是从管道读取的,而ReadFile函数,正如MSDN文档所说的那样,可以返回读取的字节数小于从管道读取的字节数。
BytesRead <= 0条件更可靠(只有当RedMon在管道的另一端写入0字节时,它才会失败,我认为它不应该这样做):
repeat
BytesRead:=StdIn.Read(Buffer,1024);
if BytesRead > 0 then
FStream.WriteBuffer(Buffer,BytesRead);
until BytesRead <= 0;https://stackoverflow.com/questions/8433134
复制相似问题