Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei einlesen / bearbeiten / speichern (https://www.delphipraxis.net/42740-datei-einlesen-bearbeiten-speichern.html)

der_don 23. Mär 2005 10:46


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

Lannes 23. Mär 2005 12:01

Re: Datei einlesen / bearbeiten / speichern
 
Hallo,

das könnte Dir weiter helfen:
Tutorial Streams von Delphi-Source.de

der_don 23. Mär 2005 12:44

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... ?

Matze 23. Mär 2005 12:52

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:
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;
Nachtrag: Den Code hat Dani damals hier gepostet.

der_don 23. Mär 2005 13:21

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 :(

Sharky 23. Mär 2005 13:36

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?

der_don 23. Mär 2005 13:39

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

Ferber 23. Mär 2005 15:03

Re: Datei einlesen / bearbeiten / speichern
 
Hi, Das sollte funktionieren.
Delphi-Quellcode:
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;
Gruss, Otto :xmas:


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