(Moderator)
Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
Delphi 2007 Enterprise
|
Re: Daten an Datei anhängen
26. Mai 2005, 11: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")
|
|
Zitat
|