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