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