Thema: Delphi Daten an Datei anhängen

Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Daten an Datei anhängen

  Alt 26. Mai 2005, 10:43
Ich als professioneller kleiner Klugscheisser würde sagen, das Sizeof(IntegerVariable) = SizeOf (Integer), aber egal:
Ich hatte das Posting von svenwel.de nicht richtig gelesen.

Also sven: Was Du da geschrieben hast, stammt nicht von meinem Pseudocode.
Teil 1: Code zerreissen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
// ***** TStream ist eine abstrakte Basisklasse. Nimm TFileStreams.
var FStream : TStream;
    Mstream : TMemoryStream;
    iMSize : integer;
begin
    Mstream := TMemoryStream.Create;
    opendialog1.Execute;
    FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

// *** Was ist, wenn hier schon was angehängt wurde ?
    FStream.Seek(0,soFromEnd);
 
    Memo1.Lines.SaveToStream(MStream);

    FStream.CopyFrom(MStream,0);
    iMSize := MStream.Size+sizeof(integer);
    Fstream.Write(iMSize,SizeOf(IMSize));

    MStream.Free;
    Fstream.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);
var FStream : TStream;
    LStream : Tstream;
begin
   opendialog1.Execute;

   LStream := TStream.Create;

   FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);

// **** Denkfehler, Du gehst ja nicht zum letzten DWORD, sondern zum VORLETZTEN!
// richtig sollte es heissen : FStream.Seek (SizeOf (Integer), soFromEnd);
   FStream.Seek(sizeof(integer)+4,soFromEnd);

// ***** Du musst doch erstmal die Datenlänge (iMSize) auslesen, das geht mit
// ***** FStream.Read (iMSize, SizeOf (Integer));
   LStream.CopyFrom(Fstream,SizeOf(Integer)-4);

// ***** Dann musst Du doch an den Anfang der Daten im FStream und DANN erst LStream einlesen, also:
// ***** FStream.Seek (iMSize, soFromEnd);
// ***** und dann iMSize-SizeOf (Integer) Bytes in LStream kopieren, also:
// ***** LStream.CopyFrom (FStream, iMSize - SizeOf (Integer));
   Memo2.Lines.LoadFromStream(LStream);

// ***** IMMER mit Try...Finally schützen...
   LStream.Free;
   Fstream.Free;

end;

Teil 2: Klugscheissen...
Also sieht der Code so aus:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  FStream : TFileStream;
  LStream : TStringStream;
  iMSize : Integer;

begin
   opendialog1.Execute;
   LStream := TStringStream.Create('');
   Try
     FStream := TFileStream.Create(opendialog1.FileName,fmOpenReadWrite);
     Try
// Wieviel Bytes sind denn in der angehängten Nachricht? Gehe zum letzen DWORD im Stream.
// Der fängt 4 Bytes von hinten gezählt an (sonst wärs ja nicht der letzte Integer)
       FStream.Seek (SizeOf (Integer), soFromEnd);
       FStream.Read (iMSize, SizeOf (Integer));
// So, dann setzen wir uns auf den Anfang der Daten.
       FStream.Seek (iMSize, soFromEnd);

// Wir haben ja 'Länge + 4 Bytes' in iMSize reingeschrieben (siehe oben), also lesen wir
// auch genau die Bytes wieder raus.
       LStream.CopyFrom (FStream, iMSize - SizeOf (Integer));

// Ein TStringstream ist ein bisserl schneller, weil ich den gelesenen String nicht *nochmal*
// kopiere. Soweit ich weiss, arbeiten die Strings mit Referenzzählern...
       Memo2.Lines.Text := LStream.DataString;
    Finally
      FStream.Free;
      End;
  Finally
    LStream.Free;
    End;
end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat