1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
unit lesethreadunit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Process, Math;
type
tLeseProzess = class
private
prozess: tProcess;
puffer,_kopie: string;
_anzahl,sollVorrat: longint;
function rAnzahl: longint;
procedure fuelleVorrat;
public
property anzahl: longint read rAnzahl;
constructor create(dateiName: string; vorratsZeilen: longint); overload;
constructor create(dateiName, kopie: string; vorratsZeilen: longint); overload;
destructor destroy; override;
function gibZeile(out s: string): boolean;
end;
implementation
// tLeseThread *****************************************************************
constructor tLeseProzess.create(dateiName: string; vorratsZeilen: longint);
begin
create(dateiName,'',vorratsZeilen);
end;
constructor tLeseProzess.create(dateiName, kopie: string; vorratsZeilen: longint);
begin
inherited create;
puffer:='';
_anzahl:=0;
sollVorrat:=vorratsZeilen;
_kopie:=kopie;
prozess:=tProcess.create(nil);
if pos('/dev/',dateiName)=1 then
prozess.executable:='/usr/bin/cat'
else begin
prozess.executable:='/usr/bin/tail';
prozess.parameters.add('-f');
prozess.parameters.add('--lines=+0');
end;
prozess.parameters.add(dateiName);
prozess.options:=prozess.options + [poUsePipes];
prozess.execute;
sleep(100);
end;
destructor tLeseProzess.destroy;
begin
prozess.free;
puffer:='';
inherited destroy;
end;
function tLeseProzess.rAnzahl: longint;
begin
fuelleVorrat;
result:=_anzahl;
end;
procedure tLeseProzess.fuelleVorrat;
var
s: string;
len,i: longint;
f: textFile;
const
maxLen = 1024*1024;
begin
while (_anzahl<sollVorrat) and (prozess.output.numBytesAvailable>0) do begin
setLength(s,min(maxLen,prozess.output.numBytesAvailable));
len:=prozess.output.read(s[1],length(s));
for i:=1 to len do
_anzahl:=_anzahl+byte(s[i]=#10);
puffer:=puffer+copy(s,1,len);
if _kopie<>'' then begin
assignFile(f,_kopie);
if not fileExists(_kopie) then
rewrite(f)
else
append(f);
write(f,copy(s,1,len));
closeFile(f);
end;
end;
end;
function tLeseProzess.gibZeile(out s: string): boolean;
begin
result:=anzahl>0;
if not result then exit;
s:=copy(puffer,1,pos(#10,puffer)-1);
delete(puffer,1,pos(#10,puffer));
dec(_anzahl);
end;
end.
|