![]() |
Delphi-Version: XE5
Textdatei bei 100 MB Truncaten
Hallo Zusammen,
ich möchte eine Textdatei auf 100MB kürzen. Folgendes habe ich gemacht
Delphi-Quellcode:
Jetzt ist es in der Regel so das die letzet Zeile irgendwo abgeschnitten wird. Ich möchte aber das in der Datei nur vollständige Zeilen enthalten sind. Wie kann ich also die letzte unvollständige Zeile löschen?
var
FileStream : TFileStream; begin FileStream := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'log.txt', fmopenreadwrite); try if FileStream.Size > 1000000 then begin FileStream.Size := 1000000; FileStream.Position := FileStream.Size; end; finally FileStream.Free; end; end; Viele Grüße Andreas |
AW: Textdatei bei 100 MB Truncaten
Hallo,
Du könntest beim Beschreiben der LogDatei prüfen ob die maximale Dateigröße erreicht ist. Ist sie erreicht wird die Datei abgeschnitten - bevor ein neuer Eintrag eingetragen wird. Grüße Klaus |
AW: Textdatei bei 100 MB Truncaten
Bevor du die Größe änderst, lade einen Block vor der Stelle wo du kürzen willst. Dann suche rückwärts bis zum ersten Zeilenumbruch. Wenn du da keinen findest, musst du eben noch einen Block vorher laden.
Dann hast du die Stelle und kannst die Größe entsprechend ändern. |
AW: Textdatei bei 100 MB Truncaten
@Klaus01: geht nicht da ich immer die alten Einträge abschneiden möchte.
@BUG: wie finde ich denn die Stelle bei genau 100MB? |
AW: Textdatei bei 100 MB Truncaten
Zitat:
Delphi-Quellcode:
. Du möchtest allerdings ein Stück nach vorne, um von da aus bis 1MB zu lesen.
FileStream.Position := 1000000;
|
AW: Textdatei bei 100 MB Truncaten
ok, soweit bin ich nun
Delphi-Quellcode:
Mein pos mit dem ich dachte das ich das carriage return finden kann findet es aber nicht :-(
const
MaxLen = 1024; var FileStream : TFileStream; Writer: TStreamWriter; Reader: TStreamReader; buffer: string; posCRLF: Integer; begin try FileStream := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'log.txt', fmopenRead);//fmOpenRead or fmShareDenyWrite); Writer := TStreamWriter.Create(FileStream); Reader := TStreamReader.Create(FileStream); filestream.Position := 999900; buffer := Reader.ReadToEnd; posCRLF := pos('#13#10' , buffer); ShowMessage('pos: ' + inttostr(posCRLF)); ShowMessage('buffer: ' + buffer); if FileStream.Size > 1000000 then begin FileStream.Size := 1000000; end; finally Writer.Free; Reader.Free; FileStream.Free; end; end; Wie kann ich denn das carriage return finden? Gruss Andreas |
AW: Textdatei bei 100 MB Truncaten
Hallo,
das CRLF wird in der Datei nicht als String '#13#10' enthalten sein. Die entsprechenden Zeichen musst Du suchen char(13). Grüße Klaus |
AW: Textdatei bei 100 MB Truncaten
Delphi-Quellcode:
Unter der Voraussetzung, dass in der Textdatei überhaupt #13#10 steht und nicht nur #13 oder nur #10 oder ganz komisch #10#13
posCRLF := pos(#13#10 , buffer);
|
AW: Textdatei bei 100 MB Truncaten
photoshop_CC_x64.rar.txt hat übrigens ~2600 MB ...
mußte also 26 x die Text-Datei kürzen :D ** hust ** |
AW: Textdatei bei 100 MB Truncaten
Irgendwie bekomme ich es nicht hin genau bis zum CR LF abzuschneiden. So habe ich es versucht
Delphi-Quellcode:
Er schneidet aber immer zu viel ab.
var
FileStream : TFileStream; Reader: TStreamReader; buffer: string; posCRLF: Integer; begin try FileStream := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'log.txt', fmopenreadwrite); Reader := TStreamReader.Create(FileStream); if FileStream.Size > 1000000 then FileStream.Size := 1000000; filestream.Position := 999900; buffer := Reader.ReadToEnd; FileStream.Size := 999900 + SizeOf(copy(buffer, 1, pos(char(13) , buffer))); finally Reader.Free; FileStream.Free; end; end; Weis einer wie ich ich es richtig berechnen muss? Gruss Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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