DruckenMister WongFacebook

Datei nach einem bestimmten String durchsuchen

System Win9x, WinNT, Win2000, WinXP, Vista, Win7
Ab Delphi-Version Delphi 1
Letzte Änderung 28.09.2010

Um in einer Datei nach einem bestimmten String zu suchen, kann die folgende Funktion benutzt werden:

function FindInFile(const AFileName: string; ASearchWord: string; AMatchCase: Boolean): Integer;
var
  fileStream: TFileStream;
  buffer: array[1..1024 * 1024] of Char;
  bufferSize: Integer;
  c: Char;
  matchPosition, i, lengthOfSearchWord: Integer;
  currentPosition, fileStreamSize: Integer;
begin
  Result := -1;
  lengthOfSearchWord := Length(ASearchWord);
  if lengthOfSearchWord = 0 then
    Exit;
  if not AMatchCase then
    ASearchWord := AnsiUpperCase(ASearchWord);
  matchPosition := 1;
  fileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    fileStreamSize := fileStream.Size;
    currentPosition := 0;
    while currentPosition < fileStreamSize do
    begin
      bufferSize := Min(high(buffer), (fileStreamSize - currentPosition));
      fileStream.ReadBuffer(buffer, bufferSize);
      currentPosition := fileStream.Position;
      i := 1;
     
      while i <= bufferSize do
      begin
        c := buffer[i];
        if AMatchCase then
          c := Char(CharUpper(PChar(c)));
        if c = ASearchWord[matchPosition] then
        begin
          if matchPosition = lengthOfSearchWord then
          begin
            Result := (currentPosition - bufferSize) + i - matchPosition + 1;
            Exit;
          end;
         
          Inc(matchPosition);
        end
        else if matchPosition > 1 then
        begin
          i := i - matchPosition + 1;
          matchPosition := 1;
        end;
        Inc(i);
      end;
    end;
  finally
    fileStream.Free;
  end;
end;

Um die Funktion kompilieren zu können, muss die Unit "Math" in die Uses-Klausel aufgenommen werden.

Der Parameter AFilename gibt die Datei an, in der gesucht werden soll. ASearchWord bestimmt das Wort, nach dem in der Datei gesucht wird und mit AMatchcase kann festgelegt werden, ob Groß- und Kleinschreibung beachtet werden soll. Die Funktion gibt die Position des Suchwortes in der Datei an. Wurde das Wort nicht gefunden, wird -1 zurückgegeben.

Zuerst öffnet die Funktion die Datei und liest aus. Damit nicht so viel Arbeitsspeicher gleichzeitig reserviert werden muss, wird die gesamte Datei nur in Schritten ausgelesen, sodass immer nur ein Teil im Arbeitsspeicher liegt. Allerdings ist es auch nicht optimal, die Datei Byteweise zu durchsuchen, da der Festplattenzugriff ebenfalls nicht sehr performant ist. Aus diesem Grund wird ein 1 Kb großer Buffer verwendet, sodass immer nur 1 Kb der Datei im Arbeitsspeicher liegen muss - 1 Kb stellt ein gewisses Optimum dar.

Beim eigentlichen Suchvorgang wird das Suchwort Byteweise mit dem Buffer verglichen. Stimmen sie überein, wurde das Wort gefunden.