2011-12-08 44 views
1

我使用redmon重新定向postscript到德爾福進行處理。Redmon&捕獲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 WritePort: OK count=65536 written=65536 

REDMON WritePort: Process not running. Returning TRUE. 
    Ignoring 65536 bytes 

的事實是, 65536只是一個紅色的鯡魚,這是我沒有正確地閱讀標準輸入,或者有一些我曾經忽視的地方有一些奇怪的限制嗎?

在此先感謝。

編輯1

的65536是一個紅鯡魚 - 雷德曼打印此消息每次64K在日誌中,整個文件就是688759個字節,然而這看起來像雷德曼年初關閉輸出,但隨後仍繼續輸出反正更多的文字。

+0

時間對一些基本的調試。你的流程是否運行?如果是這樣,它讀取了多少數據?它應該讀多少? Redmon是否經常生成* 64 * KB的數據? –

+1

請爲我們解釋redmon日誌。 –

回答

3

我不知道雷德曼是如何工作的,但我不會依靠bytesread<SizeOf(Buffer)爲EOF條件,是因爲我想你實際上是從管道讀取,並ReadFile功能MSDN文檔說可以返回的字節數少讀如果您正在從管道讀取數據,則需要讀取的字節數。

BytesRead <= 0條件更可靠(如果雷德曼會寫在管道的另一端0字節,我想這不應該這樣做只能失敗):

repeat 
    BytesRead:=StdIn.Read(Buffer,1024); 
    if BytesRead > 0 then 
    FStream.WriteBuffer(Buffer,BytesRead); 
until BytesRead <= 0; 
+0

工作完美,謝謝。 –