首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redmon &使用Delphi捕获stdin

Redmon &使用Delphi捕获stdin
EN

Stack Overflow用户
提问于 2011-12-08 23:12:22
回答 1查看 1.6K关注 0票数 1

我使用redmon将postscript重定向到delphi进行处理。

我使用以下代码将stdin读取到文件中:

代码语言:javascript
复制
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日志文件显示的情况除外:

代码语言:javascript
复制
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提前关闭了输出,但仍然会继续输出更多的文本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-09 02:18:57

我不知道RedMon是如何工作的,但我不会依赖bytesread<SizeOf(Buffer)作为EOF条件,因为我假设你实际上是从管道读取的,而ReadFile函数,正如MSDN文档所说的那样,可以返回读取的字节数小于从管道读取的字节数。

BytesRead <= 0条件更可靠(只有当RedMon在管道的另一端写入0字节时,它才会失败,我认为它不应该这样做):

代码语言:javascript
复制
repeat
  BytesRead:=StdIn.Read(Buffer,1024);
  if BytesRead > 0 then
    FStream.WriteBuffer(Buffer,BytesRead);
until BytesRead <= 0;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8433134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档