Automatische Suche nach Dateien mit Delphi realisieren // Dateisuche mit Fehlertoleranz
In diesem Beitrag möchte ich erklären, wie ich die Automatische-Suche nach MP3-Dateien in meinem Programm M3UToFolder realisiert habe. Da ich die Anwendung nicht als Open-Source anbieten möchte, entscheide ich mich zu dieser Variante und werde ab und an erklären, wie ich bestimmt Funktionen umgesetzt habe.
Die Theorie:
Wie sucht man am besten nach Dateien? Klar, man braucht erstmal den Namen, nach welcher Datei gesucht werden soll und vergleicht anschließend diesen Namen mit einer Liste von gefundenen Dateien. So zumindest habe ich mir das gedacht. Doch wenn man sein eigenes Suchverhalten genauer unter die Lupe nimmt, dann stellt sich heraus, dass man nie genau weiß wie eine Datei heißt. Sprich man kennt nicht immer jeden Buchstaben und jedes Sonderzeichen in einem Dateinamen. Man muss also eine gewisse Fehlertoleranz gewährleisten, damit die Suche wirklich praktisch ist. Doch dazu später mehr.
Mit dieser Prozedur lassen sich die Dateien eines Verzeichnisses auflisten:
procedure DateienAuflisten(Pfad: string; DateiListe: TStrings; Rekursiv: Boolean = true; Suchmaske: string = ‘*’);
var
SR1, SR2: TSearchRec;
begin
if Pfad[Length(Pfad)] <> ‘\’
then Pfad := Pfad + ‘\’;
if FindFirst(Pfad + Suchmaske, faAnyFile, SR1) = 0
then begin
repeat
if (SR1.Attr <> faDirectory)
then DateiListe.Add(Pfad+SR1.Name);
until FindNext(SR1) <> 0;
FindClose(SR1);
end;
if Rekursiv then begin
if FindFirst(Pfad+’*', faAnyFile, SR2) = 0
then begin
repeat
if (SR2.Attr = faDirectory) and (SR2.Name <> ‘.’) and (SR2.Name <> ‘..’)
then DateienAuflisten(Pfad+SR2.Name, DateiListe, true);
until FindNext(SR2) <> 0;
FindClose(SR2);
end;
end;
end;
Wie man bereits sieht, wird eine TStringlist “DateiLste” benötigt. Dieses Objekt muss man im Vorfeld erstellen. Die Delphi-Prozedur habe ich übrigens einfach aus diesem Thread im Delphi-Forum übernommen. Wieso sollte man das Rad neu erfinden?
Suchfunktion mit Fehlertoleranz bei der Eingabe. Die Idee:
Da man nun eine Liste mit Namen und Pfaden hat, kann man überprüfen, wie ähnlich sich die Namen sind. Ich habe mir nämlich einfach gedacht, dass man die Strings auf Ähnlichkeit überprüft und selber in Prozent angeben kann, wie genau gesucht werden soll. Das geht ganz einfach mit dieser Funktion, die ich auf swissdelphicenter.ch gefunden habe.
function DoStringMatch(s1, s2: string): Double;
var
i, iMin, iMax, iSameCount: Integer;
begin
iMax := Max(Length(s1), Length(s2));
iMin := Min(Length(s1), Length(s2));
iSameCount := -1;
for i := 0 to iMax do
begin
if i > iMin then
break;
if s1[i] = s2[i] then
Inc(iSameCount)
else
break;
end;
if iSameCount > 0 then
Result := (iSameCount / iMax) * 100
else
Result := 0.00;
end;
Ich setze einfach voraus, dass man weiß, wie Objekte erstellt werde und dergleichen. Wenn nicht, dann kann ich diese Fragen noch eingehender beantworten. Ich wollte hier lediglich einen kleinen Denkanstoß geben, wie man so eine Suche in Delphi realisieren kann. Besonders der Algorithmus zum Vergleichen der Strings eignet sich für viele Möglichkeiten. So könnte man zum Beispiel auch die Wörter in einem Text vergleichen.

