Hallo,
wie kann ich den ANFANG einer TextDatei löschen? Dateien sind z.B. 40 MB groß, und ich möchte nur die letzten 10 MB Datei haben. Ich habe bereits eine Funktion, aber die braucht auf meiner Maschiene (P200) ca. 40 sec. Das ist zu langsam. Kennt jemand eine schnellere Funktion?
Gruß
Wolfgang
Hier noch die Funktion:
<pre>
function TrimFile(FileName : String;
MaxSize : LongInt): Boolean;
var
S : TFileStream;
D : TMemoryStream;
begin
if MaxSize <= 0 then MaxSize := 1;
Result := true;
try
S := TFileStream.Create(FileName, fmOpenReadWrite); //Quelle öffnen
D := TMemoryStream.Create; //Memorystream anlegen
S.Seek(S.Size - MaxSize, soFromBeginning); //Pos. ab der kopiert werden soll setzen
D.CopyFrom(S, MaxSize); //Kopieren in MemoryStream (Langsam)
D.Seek(0, soFromBeginning); //Pos. im MemoryStream setzen
S.Seek(0, soFromBeginning); //und im FileStream setzen
S.CopyFrom(D, MaxSize); //und zurück in den FileStream
S.Size := MaxSize; //Rest abschneiden
S.Free; //Quelle schliesen
D.Free; //Memory Stream freigeben
except
Result := False;
end;
end;
</pre>
Als Alternative hatte ich folgendes probiert:
<pre>
function TrimFile(FileName : String;
MaxSize : LongInt): Boolean;
var
S : TFileStream;
D : TMemoryStream;
begin
if MaxSize <= 0 then MaxSize := 1;
Result := true;
try
S := TFileStream.Create(FileName, fmOpenRead); //Quelle öffnen
D := TMemoryStream.Create; //Memorystream anlegen
S.Seek(S.Size - MaxSize, soFromBeginning); //Pos. ab der kopiert werden soll setzen
D.CopyFrom(S, MaxSize); //Kopieren in MemoryStream
D.Seek(0, soFromBeginning); //Pos. im MemoryStream setzen
S.Free; //Quelle schliesen
D.SaveToFile(FileName);
D.Free; //Memory Stream freigeben
except
Result := False;
end;
end;
<pre>
ist aber auch nicht schneller
wie kann ich den ANFANG einer TextDatei löschen? Dateien sind z.B. 40 MB groß, und ich möchte nur die letzten 10 MB Datei haben. Ich habe bereits eine Funktion, aber die braucht auf meiner Maschiene (P200) ca. 40 sec. Das ist zu langsam. Kennt jemand eine schnellere Funktion?
Gruß
Wolfgang
Hier noch die Funktion:
<pre>
function TrimFile(FileName : String;
MaxSize : LongInt): Boolean;
var
S : TFileStream;
D : TMemoryStream;
begin
if MaxSize <= 0 then MaxSize := 1;
Result := true;
try
S := TFileStream.Create(FileName, fmOpenReadWrite); //Quelle öffnen
D := TMemoryStream.Create; //Memorystream anlegen
S.Seek(S.Size - MaxSize, soFromBeginning); //Pos. ab der kopiert werden soll setzen
D.CopyFrom(S, MaxSize); //Kopieren in MemoryStream (Langsam)
D.Seek(0, soFromBeginning); //Pos. im MemoryStream setzen
S.Seek(0, soFromBeginning); //und im FileStream setzen
S.CopyFrom(D, MaxSize); //und zurück in den FileStream
S.Size := MaxSize; //Rest abschneiden
S.Free; //Quelle schliesen
D.Free; //Memory Stream freigeben
except
Result := False;
end;
end;
</pre>
Als Alternative hatte ich folgendes probiert:
<pre>
function TrimFile(FileName : String;
MaxSize : LongInt): Boolean;
var
S : TFileStream;
D : TMemoryStream;
begin
if MaxSize <= 0 then MaxSize := 1;
Result := true;
try
S := TFileStream.Create(FileName, fmOpenRead); //Quelle öffnen
D := TMemoryStream.Create; //Memorystream anlegen
S.Seek(S.Size - MaxSize, soFromBeginning); //Pos. ab der kopiert werden soll setzen
D.CopyFrom(S, MaxSize); //Kopieren in MemoryStream
D.Seek(0, soFromBeginning); //Pos. im MemoryStream setzen
S.Free; //Quelle schliesen
D.SaveToFile(FileName);
D.Free; //Memory Stream freigeben
except
Result := False;
end;
end;
<pre>
ist aber auch nicht schneller