Thema: Delphi Beste Speicherart ?

Einzelnen Beitrag anzeigen

Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#28

Re: Beste Speicherart ?

  Alt 28. Jan 2005, 18:58
es geht so:

Delphi-Quellcode:
FS{tfilestream} := TFileStream.Create(FileName{string, name unter welchem die datei geschbeichert werden soll}, fmCreate);

    //Text(string) speichern
    Buffer{string} := "text";
    FS.Write(Buffer[1], SizeOf(Buffer));

    //Zahl(integer) speichern
    //Tipp: ein integer verbraucht 4 bytes speicherplatz, wird also auf diese weise mit lediglich 4 byte speicherverbrauch gespeichert und ist mit notepad&co nicht darstellbar, schon das sürfte solche total-noobs abschrecken ;)
    BufferI{Integer} := 123;
    FS.Write(BufferI, SizeOf(Integer));

//text der variabel lang ist kann z.b. so gespeichert werde:
    Buffer := "Hallo. Dies ist ein Text, er kann beliebig lang sein.";
    {er kann natürlich net beliebig lang sein, nur 4 gigabyte groß!! ansonsten muss unten statt Integer Int64 verwendet werden, dann braucht das ganze ding mehr speicherplatz! und delphi hat glaubich auch ne maximallänge für strings oder?}
    BufferSize{Integer, wenn Buffer>4gb dann Int64} := Length(Buffer);
    FS.Write(BufferSize, SizeOf(Integer{/Int64}));
    FS.Write(Buffer[1], BufferSize);
//hier werden also zuerst in 4 bytes die länge des strings gespeichert und dann kann er spöäter nach bedarf ausgelesen werden.
//Diese methode braucht keinen Terminator und ich finds besser weil man _alle_ buchstaben speichern kann und nicht einen escapestring oder so hat.

//datei schließen
FS.Free;


////datei lesen
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);

{buffer: struing}
{buffersize: integer}

//in der datei "rumspulen" - geht auch beim schreiben;)
FS.Seek(0, soFromBeginning); //an anfang der datei
FS.Seek(0, soFromEnd); //ans ende der datei
FS.Seek(8, soFromCurrent); //8 buchstaben weiter
FS.Seek(-3, soFromEnd); //3 buchstaben vorm ende
FS.Seek(-12, soFromCurrent); //12 buchsteben zurück

//string lesen
SetLength(Buffer, 5{wie lang ist der string?});
FS.Read(Buffer[1], 5{wie lang ist der string?});

//integer lesen
FS.Read(BufferI, SizeOf(Integer));

//lies die konstrkution von vorher wieder aus, also zuerst 4 bytes längenindikator, dann den string selber
    FS.Read(BufferSize{<-so lang ist der string}, SizeOf(Integer));
    SetLength(Buffer, BufferSize); //buffer mit #0's füllen
    FS.Read(Buffer[1], BufferSize); //buffer auslesen
//wenn man vorher In64 genommen hat muss man hier natürlich auch Int64 einsetzen!

fs.free;

//wenn man z.b. inner datei unbekannt viele integers speichert kann mans ja so machen alle auszulesen:
while FS.Position < FS.Size do
  FS.Read(BufferI, SizeOf(Integer));
  //mach was mit bufferI
end;
Also: wenn man 5 buchstaben liest oder schreibt(.Write/.Read) dann spults in der datei automatisch 5 buchstaben weiter, man braucht nicht immer mit .Seek rumspulen.

Tipp: dauerndes rumspulen mahcts programm langsam!!

Tipp2: nemht den TMemoryStream statt den Filestream(ist genau gleich, nur dass kein dateiname angegeben werden muss)->bedienung genau gleich aber alles wird statt inner datei nur im RAM gespeichert.
Es gibt ja auch noch den TZipStream(oder so ähnlich) der speichert alles glaub wie der memory stream im ram bloß er verpackts gleich mit ZIP
-Dominik
Dominik Weber
www.edo-soft.com
  Mit Zitat antworten Zitat