Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TMemoryStream, Insert Daten? (https://www.delphipraxis.net/147132-tmemorystream-insert-daten.html)

schwa226 2. Feb 2010 12:09


TMemoryStream, Insert Daten?
 
Hi,

ich stehe vor folgendem Problem. Ich kopiere eine Ordner/Filesruktur in einen MemoryStream.
Wenn alles fertig ist möchte ich noch die Stream.Size ganz am Anfang vom Stream einfügen.
Geht das irgendwie?

Derzeit mache ich einen neuen Temporären Stream, schreibe die Original-Streamsize rein und kopiere anschließend den Stream in meinem Temp.Stream.

Bei Streams von einigen MB dauert das dann aber recht lange.

Ein Insert habe ich bei Streams nicht gefunden...

Astat 2. Feb 2010 12:23

Re: TMemoryStream, Insert Daten?
 
Hallo schwa226, das geht nicht, aber setze einfach am Ende die Size.
Ist ja egal ob Du vorne oder hinten die Size ausließt.

lg. Astat

DeddyH 2. Feb 2010 12:25

Re: TMemoryStream, Insert Daten?
 
Oder einfach vor dem Befüllen 0 an den Anfang und später aktualisieren. Solange der Datentyp (Cardinal?) stimmt, müsste das IMO auch funktionieren.

himitsu 2. Feb 2010 12:54

Re: TMemoryStream, Insert Daten?
 
Beim MemoryStream geht das noch einfach, da man dort direkten Zugriff auf den Inhalt hat.

Delphi-Quellcode:
Type TMemoryStreamInsertHelper = Class Helper for TCustomMemoryStream
    Procedure InsertBuffer(Const Buffer; Count, Pos: LongInt);
  End;

Procedure TMemoryStreamInsertHelper.InsertBuffer(Const Buffer; Count, Pos: LongInt);
  Begin
    If Count <= 0 Then Exit;
    If (Pos < 0) or (Pos > Size) Then
      Raise EWriteError.CreateRes(@SWriteError);
    Size    := Size + Count;
    Position := Pos;
    MoveMemory(PAnsiChar(Memory) + Pos + Count, PAnsiChar(Memory) + Pos, Size - Pos);
    If Write(Buffer, Count) <> Count then
      Raise EWriteError.CreateRes(@SWriteError);
  End;
Bei anderen Streams müßte man alles, welches verschoben werden soll auslesen,
um das "Offset" verschoben neu reinspeichern und zum Schluß ebenfalls in die Lücke die neuen Daten reinmachen.


Aber der Vorschlag von DeddyH ist dagegen immernoch das Idealste.

schwa226 2. Feb 2010 13:22

Re: TMemoryStream, Insert Daten?
 
Danke für die schnelle Hilfe!

Habe nun einen Buffer (Int64) vorgesehen. In diesem wird zum Schluss dann die Streamsize geschrieben.

Beim probieren hab ich noch folgendes bemerkt:

Delphi-Quellcode:
  Stream.SaveToStream(SendStream);
  //SendStream.CopyFrom(Stream, Stream.Size);
Das SaveToStream geht um Welten schneller als CopyFrom!


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz