AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelles Suchen nach Dateien

Ein Thema von GFEMajor · begonnen am 25. Jan 2009 · letzter Beitrag vom 25. Jan 2009
 
GFEMajor

Registriert seit: 30. Dez 2008
15 Beiträge
 
#1

Schnelles Suchen nach Dateien

  Alt 25. Jan 2009, 09:29
Liebe Delphi Experten.
Ich habe wieder ein (für mich) großes Problem.

Ich arbeite immer noch an meiner Musiksuche, mit der ich Titel auf der Festplatte suchen kann.
Ich hab das ganze schonmal in Java umgesetzt und es so gemacht:
Alle Dateinamen in den Hauptspeicher lesen und dann dort suchen.

Jetzt wollte ich es in Delphi genauso machen, aber es geht einfach nicht schnell genug.
Ich suche mit FindFirst/FindNext usw alle Dateien in einem Wurzelverzeichnis und speichere die Dateinamen und den Pfad in einem Array vom Typ FileEntry (definition unten).
Es funktioniert zwar, aber viel zu langesam. Ich hab ca. 100.000 Dateien die hinzugefügt werden müssen.
Die Länge des Arrays setz ich schon ganz am Anfang, um es nicht jedes mal machen zu müssen, wenn ein Element hinzugefügt wird.

Hier mal die betreffenden Code Zeilen:

Delphi-Quellcode:
RFileEntry = packed record
 FileName: string[255];
 FilePath: string;
end;

procedure FindAllFiles(var FileEntrys : array of RCRSFileEntry; RootFolder: string; Mask: TStrings = nil; Recurse: Boolean = True);
var
  SR: TSearchRec;
  i: Integer;
  Item: RFileEntry;
begin
  RootFolder := IncludeTrailingPathDelimiter(RootFolder);
  if Mask = nil then
  begin
    Mask := TStringList.Create;
    Mask.Add('*.*');
  end;
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then // Verzeichnis
        begin
          if (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            FindAllFiles(FileEntrys, RootFolder + SR.Name, Mask, Recurse);
          end;
        end else // Datei gefunden
        begin
          for i:= 0 to Mask.Count-1 do // schauen ob sie in der Maske ist
          begin
            if ExtractFileExt(SR.Name) = ExtractFileExt(Mask[i]) then
            begin
              Item.FileName := SR.Name;
              Item.FilePath := RootFolder;
              AddFileToFileList(Item);
            end;
          end;
        end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
end;

procedure AddFileToFileList(Item : RFileEntry);
begin
  Files[aktLength] := Item;
  Inc(aktLength);
end;
Files ist dabei eine Propery der Komponente, die das einlesen übernimmt.

Grund warum ich alles in den Speicher lade ist die Performance beim Suchen. Die eigentlich Suche soll richtig schnell gehen, da bei mir schon bei der Eingabe des Suchwortes (wenn 3-4 buchstaben eingegeben wurden) automatisch gesucht werden soll. Darum ist mit die Performance beim Suchen sehr wichtig.

Falls es eine (schnelle) Möglichkeit gibt direkt auf den Dateinamen zu suchen wäre ich auch zufrieden.
Vielleicht fällt ja jemand etwas ein, wie ich die ganze Sache beschleunigen kann. Zur Zeit braucht das einlesen ca. 30 min-1 Stunde (hab noch nicht genau gemessen). Das ist aber auf jeden Fall viel zu lange. Zeiten bis 5 Minuten (für das einladen) wären für mich noch akzeptabel.

LG und schonmal vielen Dank
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz