Announcement

Collapse
No announcement yet.

Anfang einer TextDatei löschen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfang einer TextDatei löschen

    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
Working...
X