Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Pipe EOF abfragen oder so :)

  Alt 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
  Mit Zitat antworten Zitat