AW: Textdatei bei 100 MB Truncaten
ich hab nochmal nachgeschaut
FileStream.Size gibt die Größe in Bytes an SizeOf() gibt auch die Größe in Bytes an Wenn ich also das mache FileStream.Size := 999900 + SizeOf(copy(buffer, 1, pos(char(13) , buffer))) dann sollte ich doch am Ende der Zeile landen. Ist aber leider nicht so?! |
AW: Textdatei bei 100 MB Truncaten
mit
Delphi-Quellcode:
findest Du immer das erste Auftreten eines Strings/Zeichen. Du willst aber das letzte.
pos
wie wäre es mit so etwas z.B.
Delphi-Quellcode:
Gruß
i:=length(buffer);
repeat dec(i,1); until (i<0) or buffer[i]=$0D; if buffer[i]=$0D then....... K-H P.S. Mit anderen worten stand das schon in #3 |
AW: Textdatei bei 100 MB Truncaten
Euch ist aber auch klar dass man vorne auch nur einfach so abschneiden kann wenn die Datei kein Byte Order Mark hat, oder?
Das würde ich mir wenigstens am Anfang noch auslesen, dann ausrechnen, wie viel wir wegwerfen wollen, im Stream soweit (minus die Größe des BOM) vorwärts wandern, BOM wieder schreiben und zumachen. |
AW: Textdatei bei 100 MB Truncaten
hmmm, ja ok. Damit bekomme ich die Position der CRLF. Ich denke die hatte ich vorher auch schon. Wie bekomme ich aber nun die Länge in Bytes des Buffers von Anfang bis zu CRLF?
|
AW: Textdatei bei 100 MB Truncaten
Zitat:
So wie ich es verstanden habe soll eine Textdatei (Zeilenende=#13#10) nach 100 MB (oder 99,5674593 MB) abgeschnitten werden. Dafür würde ich mehrere Buffer zu je xxByte lesen und schreiben und im letzten vor Erreichen der 100MB Grenze suche ich das letzte #13#10 (oder wie auch immer das Zeilenende aussieht) und schreibe den Bufferinhalt bis zu dieser Position weg. (hoffentlich ist der Buffer so groß, daß auch die längsten Zeilen da hinein passen!) Da ist mir doch vollkommen egal was für eine Kodierung/Zeichensatz die Datei hat. Konkret muß ich nur die Kodierung von "Zeilenende" kennen. Gruß K-H |
AW: Textdatei bei 100 MB Truncaten
[QUOTE=p80286;1309014]So wie ich es verstanden habe soll eine Textdatei (Zeilenende=#13#10) nach 100 MB (oder 99,5674593 MB) abgeschnitten werden.[/URL]
Ok, dann halt so. Da ich "log.txt"-Datei gelesen hatte dachte ich man schneidet dort ältere Nachrichten ab statt neuere. |
AW: Textdatei bei 100 MB Truncaten
ups, da hast Du vollkommen Recht. Ich muss also oben abschneiden.
|
AW: Textdatei bei 100 MB Truncaten
@Schönster aller Günther
Hast Du eine neue Kristalkugel oder kannst Du Gedanken lesen?:stupid: Gruß K-H |
AW: Textdatei bei 100 MB Truncaten
.. wenn neue log Einträge via add hinzugefügt werdem werden diese am Ende der Datei angehängt und die lätesten Enträge sind am Anfang der Datei.
Werden neue log Einträge via insert immer am Anfang der Datei eingefügt sind die ältesten Einträge am Ender der Datei. Grüße Klaus |
AW: Textdatei bei 100 MB Truncaten
Zitat:
Auf die schnelle ungetestet: 100.000 Bytes Truncate
Delphi-Quellcode:
procedure Truncate100;
var FS : TFileStream; Buffer : TDynByteArray; I : Integer; begin FS := TFileStream.Create('log.txt',fmOpenread); try if FS.Size > 100000 then begin FS.Seek(100000,soEnd); Setlength(Buffer,100000); FS.ReadBuffer(Buffer[0],100000); FS.Free; i := 0; While i < 99999 do begin if (Buffer[i] = 13) and Buffer[i+1] = 10 then begin inc(I,2); break; end; inc(i); end; FS := TFileStream.Create('log.txt',fmOpenWrite); try FS.WriteBuffer(Buffer[i],100000-i); finally FS.Free; end; end; finally FS.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz