AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Filestream, string anhängen

Ein Thema von eLse-maestro · begonnen am 16. Jan 2008 · letzter Beitrag vom 18. Jan 2008
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Re: Filestream, string anhängen

  Alt 17. Jan 2008, 22:10
Delphi-Quellcode:
if not (count = fs.Size) then

//oder besser

if count <> fs.Size then

if count < fs.Size then
Delphi-Quellcode:
function GetFileStrFromEnd(FileName: String): String;
var
  FS: TStream;
  I,count: integer;
  
begin
count:=0;
  result := ''; // stream ist kleiner

  FS := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
  try
    while (count <= fs.Size) and (pos('[data]',result) = 0) do
    begin
      if FS.Seek(-Count, soFromEnd) = FS.Size - Count then
      begin
        Setlength(Result,Count);
        FS.Read(Result[1],Count);
      end;
      inc(count);
    end;
    if pos('[data]',result) = 0 then result := ''; // fals string nicht gefunden wurde
  finally
    fs.Free;
  end;
end;
wie groß ist deine Datei, bzw. wie lang ist der String maximal, den du suchst?

so ließt du ja die Datei mehrmals vom Ende her ein ... Length(Result)-mal

Count=0 wurd es eh nicht geben und wenn dein String mit [data] anfängt, dann kannst bei der Vorgehensweise du auch gleich bei count=Length('[data]'); oder count=6; anfangen, den kürzer kann der String nicht sein.


falls die Maximalläge nicht feststeht und du nicht immer einen genügendgroßen Block auslesen willst, dann
könnte man auch in größeren Schritten zurückgehn (nicht nur 1 > inc(count), sondern gleich ein paar byte mehr



oder du ließt gleich nur einmal einen größer Block (ganze Datei, oder soviel wie der String maximal lanhg ist) aus, suchst darin den Stringanfang und kopierst dir ab dem Fundort den String bis Datei-/Blockende in Result rein.
Delphi-Quellcode:
FS.Seek(-1024, soFromEnd); // 1024 = 1 KB
SetLength(Result, 1024);
FS.Read(Result[1], 1024);
Result := Copy(Result, Pos('[data]', Result), 1024);
// statt Copy Delete(Result, 1, Pos('[data]', Result) - 1);



erstellst du die Datei selber?
wenn ja, dann speicher doch die Stringgröße (siehe oben), dann kannst die Auslesen und du weißt wo der String ist.

Dieses Länge/Größe kann man auch nach dem String speichern (nicht immer nur davor, wie oben sichtbar)
Delphi-Quellcode:
FS.Seek(-SizeOf(Len), soFromEnd);
FS.Read(Len, SizeOf(Len));
FS.Seek(-SizeOf(Len) - Len, soFromEnd);
SetLength(Result, Len);
FS.Read(Result[1], Len);

> alles in Kurz und ohne Fehlerprüfung und sowas
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz