![]() |
im FileStream bestimmte Zeichen ersetzen
ich habe mit
Delphi-Quellcode:
eine Datei gelesen und möchte nur im Stream bestimme Zeichen wie z.B. Hex 00 durch Leerzeichen ersetzen
TFileStream.Create(opendialog1.filename, fmOpenReadWrite or fmShareDenyWrite)
mit der Funktion StringReplace funktioniert das im Filestream nicht |
Re: im FileStream bestimmte Zeichen ersetzen
Handelt es sich um eine Textdatei? Dann würde ich keinen TFileStream benutzen.
Was du bei einem FileStream machen kannst wäre z.B. byteweise ein Byte lesen, vergleichen und ggf. die Position ein Byte zurücksetzen und das Ersatzbyte schreiben. Das wäre aber sehr langsam. Was sinnvoll ist, hängt vom Dateityp und der Dateigröße ab. Möglich wäre z.B. den Inhalt in einen String oder Bytearray zu kopieren, usw. |
Re: im FileStream bestimmte Zeichen ersetzen
Es ist im Prinzip eine Textdatei, Sie enthält aber Drucksteuerzeichen. Das bewirkt, das es mit einer Stringlist oder auch Memoliste nicht funktioniert. Hier wir immer nur ein Teil gelesen.
Habe es auch schon mit BlockRead versucht. Leider weiß ich nicht wie ich die komplette Datei einlese und dann von Anfang bis Ende die Datei durchsuche. |
Re: im FileStream bestimmte Zeichen ersetzen
Zitat:
|
Re: im FileStream bestimmte Zeichen ersetzen
M F Bitte bei der Zahlung angeben
so sieht die Datei mit notepad aus. lässt sich aber komplet öffnen |
Re: im FileStream bestimmte Zeichen ersetzen
Mit den beiden folgende Funktionen kannst du die komplette Datei als String einlesen, verändern und wieder speichern (am Besten unter einem anderen Dateinamen).
Wenn deine Datei ~ 10 Megabytes überschreitet musst du dir Gedanken machen, nur Teile der Datei einzulesen und zu manipulieren. So aber ist es am Einfachsten: alles in den Speicher lesen, verändern, zurückschreiben.
Delphi-Quellcode:
// kopiert aus der JCL
function FileToString(const FileName: string): AnsiString; var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then fs.ReadBuffer(Result[1], Len); finally fs.Free; end; end; procedure StringToFile(const FileName: string; const Contents: AnsiString); var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmCreate); try Len := Length(Contents); if Len > 0 then fs.WriteBuffer(Contents[1], Len); finally fs.Free; end; end; |
Re: im FileStream bestimmte Zeichen ersetzen
du kannst die komplette Datei vom Stream kurz in einen Puffer laden, darin die Zeichen ersetzen und dann zurück in en Stream, oder eben Stückchenweise (Byteweise oder in größeren Stückchen)
man könnte auch auch 2 Streams nutzen ... mit einem Stream aus der Datei lesen, dann da stückchenweise raus, bearbeiten und in den anderen stream rein und statt die Datei danach wieder zurück in den Stream zu schicken, könnte man sie auch gleich im Puffer (z.B. einem String) belassen (siehe shmia) |
Re: im FileStream bestimmte Zeichen ersetzen
vielen Dank für die vielen Tipps.
nur weiß ich nicht wie ich in einem Strem bzw. Puffer Zeichen ersetzte. welchen Befehl kann ich dafür benutzen. |
Re: im FileStream bestimmte Zeichen ersetzen
Stell Dir den Stream als großes Byte-Array vor. Du kannst nur nicht direkt darauf zugreifen, sondern musst einzelne Byte (oder Byteblöcke) mit Stream.Methoden lesen/schreiben
Delphi-Quellcode:
Also im Prinzip nach dem öffnen zweier Streams aus dem einen ein Byte lesen... prüfen und evtl. anderen Wert zuweisen... dann Byte in zweiten Stream schreiben.
Stream.Read(aByte, SizeOf(aByte))
Stream.Write(aByte, SizeOf(aByte)) |
Re: im FileStream bestimmte Zeichen ersetzen
Ich habe es jetzt so gelöst vielen Dank
Delphi-Quellcode:
function FileToStringErsetze(const FileName: string;NeueZeichen: string;zuErsetzendeZeichen:integer): AnsiString;
var fs: TFileStream; Len,j: Integer; temp: string; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then fs.ReadBuffer(Result[1], Len); for j := 1 to Len do if Ord(Result[j]) = zuErsetzendeZeichen then Temp := Temp + NeueZeichen else Temp := Temp + Result[j]; finally Result:=Temp; fs.Free; end; end; Aufruf über
Delphi-Quellcode:
SL := TStringList.create ;
SL.add(FileToStringErsetze(opendialog1.filename,'|',00)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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