![]() |
Datei einlesen / bearbeiten / speichern
Hi
bin neu in diesem Forum, daher weiss ich nicht genau wo ich diesen Thread hinschreiben soll. Naja. Ich hab ein Problem mit dem auslesen einer Datei (nicht txt)! In dieser Datei stehen die Daten in Hex Code, d.h. wenn ich die Datei z.B. mit dem Editor öffne seh ich Sonderzeichen etc. Mit dem Hexeditor kann ich die Datei lesen. Nun zu meinem Problem. Ich möchte diese Datei auslesen (mit TFileStream oder so) und nach einem bestimmten String suchen und diesen umschreiben. Nun habe ich da ein kleines Problem. Und zwar: Wenn ich die Datei ohne weiteres auslese und in ein Memo anzeigen lasse ist nach dem 5. Zeichen Schluss. Im Hexeditor ist das 5. Zeichen "00" ... Wenn ich das aus der Datei entferne arbeitet mein Programm so wie ich es will und muckt nicht rum. Kann es wirklich nur an "00" liegen ? Später in dieser Datei taucht "00" bestimmt noch 50 mal auf und das Programm stoppt dort nicht .... Ich bin kurz vorm verzweifeln... :( Kann mir jemand helfen und mir sagen, wie ich die komplette Datei (nicht *.txt), also jedes Zeichen, auslesen kann und in nem Stream speichern kann?!?!? mfg don |
Re: Datei einlesen / bearbeiten / speichern
|
Re: Datei einlesen / bearbeiten / speichern
naja so richtig hilft das auch nicht. Möchte das Zeug ja nicht in einem Array speichen... Gibts da keine anderen Möglichkeiten/Links/etc... ?
|
Re: Datei einlesen / bearbeiten / speichern
Herzlich willkommen!
Das habe wurde mir hier einmal auf ein ähnliches Problem hin geantwortet, wenn ich den Autor finde, editiere ich den Beitrag, noch. Evtl. geht es damit:
Delphi-Quellcode:
Nachtrag: Den Code hat Dani damals
function TForm1.ScanFileForString(aFile, SearchString: String; IgnoreCase: Boolean=true;
MaxBytesScanned: Int64 = 2097152): Boolean; const MAX_BUFFER_SIZE = 20480; //20 kb var Buffer: String; FS: TFileStream; BytesRead: Integer; i, match: Integer; BufferSize, StrLength: Integer; begin Result := false; If (SearchString = '') then exit; If IgnoreCase then SearchString := ANSIUppercase(SearchString); //Datei öffnen... falls das nicht klappt gibts hier ne Exception //daher die Funktion besser im try..except Schutzblock aufrufen! FS := TFileStream.Create(aFile, fmOpenRead or fmShareDenyWrite); try BufferSize := 0; StrLength := Length(SearchString); //Ermitteln wie groß der Puffer sein muss. Er soll ca. 20 kb groß sein, //wenn nicht die ganze Datei reinpasst If FS.Size <= MAX_BUFFER_SIZE then BufferSize := FS.Size else BufferSize := (MAX_BUFFER_SIZE div StrLength) * StrLength; SetLength(Buffer, BufferSize); Repeat //Höchstens MaxBytesScanned Bytes untersuchen oder bis EOF BytesRead := FS.Read(Buffer[1], BufferSize); If BytesRead = 0 then exit; If IgnoreCase then Buffer := ANSIUppercase(Buffer); for i:=1 to BytesRead do begin if Abbruch then exit; Application.ProcessMessages; match := 0; If (BufferSize-(i-1) >= StrLength) then while (Buffer[i+match] = SearchString[match+1]) do begin if Abbruch then exit; Application.ProcessMessages; inc(match); If match = StrLength then begin Result := true; //exit; end; end; end; Until (FS.Position >= MaxBytesScanned) or (FS.Position = FS.Size); finally FS.Free; SetLength(Buffer, 0); end; end; ![]() |
Re: Datei einlesen / bearbeiten / speichern
Danke für die Antwort Matze!
Aber ich brauche glaube etwas mehr als nur die Funktion, da ich ein Anfänger in Delphi bin :( Ein Bischen Erklärungen zu einzelnen Sachen wäre nicht schlecht, da ich es ja auch verstehen muss sonst Frage ich beim nächsten mal wieder :( |
Re: Datei einlesen / bearbeiten / speichern
Hai der_don,
kommt der String nur einmal in der Datei vor? Und ist der String mit dem er ersetzt werden soll genau so lange? |
Re: Datei einlesen / bearbeiten / speichern
ja der gesuchte String kommt nur einmal vor und er soll durch einen String ersetzt werden, welcher genauso lang ist ...
|
Re: Datei einlesen / bearbeiten / speichern
Hi, Das sollte funktionieren.
Delphi-Quellcode:
Gruss, Otto :xmas:
function ReplaceString(InFileName, OutFileName, SearchString, ReplaceString:String):Integer;
var s:TMemoryStream; p:PChar; begin Result := 0; If (SearchString = '') then exit; if Length(SearchString)<>Length(ReplaceString) then exit; s:=TMemoryStream.Create; try s.LoadFromFile(InFileName); Result:=Pos(SearchString, String(s.Memory)); if Result>0 then begin p:=PChar(ReplaceString); Move(p^, Pointer(Integer(s.Memory)+Result-1)^,Length(SearchString)); end; s.SaveToFile(OutFileName); finally s.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 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