Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
Delphi 12 Athens
|
AW: Pipe EOF abfragen oder so :)
19. Nov 2010, 15:39
Ich glaub da täuschst du dich etwas.
Delphi-Quellcode:
var h: THandle;
w: Cardinal;
o: TOverlapped;
a, b, c, d: AnsiString;
begin
a := '1234567890';
h := CreateFile('a.aaa', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
if (h = INVALID_HANDLE_VALUE)
or not WriteFile(h, a[1], 10, w, nil)
or (W <> 10) then
RaiseLastOSError;
CloseHandle(h);
SetLength(b, 5);
h := CreateFile('a.aaa', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if (h = INVALID_HANDLE_VALUE)
or not ReadFile(h, b[1], 5, w, nil)
or (w <> 5) then
RaiseLastOSError;
CloseHandle(h);
SetLength(c, 5);
h := CreateFile('a.aaa', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if (h = INVALID_HANDLE_VALUE)
or (SetFilePointer(h, 2, nil, FILE_BEGIN) <> 2)
or not ReadFile(h, c[1], 5, w, nil)
or (w <> 5) then
RaiseLastOSError;
CloseHandle(h);
FillChar(o, SizeOf(o), 0);
o.Offset := 3;
SetLength(d, 5);
h := CreateFile('a.aaa', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if (h = INVALID_HANDLE_VALUE)
or not ReadFile(h, d[1], 5, w, @o)
or (w <> 5) then
RaiseLastOSError;
CloseHandle(h);
DeleteFile('a.aaa');
ShowMessage(Format('b:%d c:%d c:%d', [Pos(b, a)-1, Pos(c, a)-1, Pos(d, a)-1]));
end;
würde Overlappt ignoriert, dann müßte b:0 c:2 c:0
rauskommen und nicht b:0 c:2 c:3
.
Man kann das Overlappt auch synchron verwenden, wobei hier der Offset genutzt wird.
Ohne Overlappt wird die aktuelle Dateiposition verwendet und diese dabei verschoben/erhöht.
Mit Overlappt wird das dort enthaltene Offset verwendet und der Positionszeiger nicht verschoben.
Ausnahme sind Pipes/Handles, welche keinen Datenzeiger unterstützen, sondern nur eine sequentielle Übertragung.
$2B or not $2B
|