Results 1 to 3 of 3

Thread: NLDFileSearch

  1. #1

    NLDFileSearch

    Dit is 'm dan, de NLDFileSearch unit.
    Hoewel de functionaliteit wel handig is, is de implementatie waarschijnlijk één van de mooiste staaltjes van "moeilijk doen als het ook makkelijk kan", maar daarom misschien juist wel leuk en leerzaam.

    Het stelt misschien weinig voor bij alle grote open source projecten, maar toch wil ik dit stukje code delen om wat mensen tegemoet te komen. Met name de mensen die moeite hebben met het implementeren van FindFirst..FindNext constructies voor het zoeken naar files.

    Ach, neem deze code "Ter Leringh Ende Vermaeckh"

    In deze unit zitten twee (eigenlijk drie) procedures die een opgegeven pad afzoeken.

    Code:
    procedure NLDEnumFiles(Path: string; CallBack: TNLDFoundFileProc;
                           Options: TFSOptions); overload;
    procedure NLDEnumFiles(Path: string; CallBack: TNLDFoundFileEvent;
                           Options: TFSOptions); overload;
    procedure NLDGetFiles(Path: string; List: TStrings;
                          Options: TFSOptions);
    De EnumFiles procedures geven elke gevonden file terug aan de ingestelde callback. Een callback procedure kan een gewone procedure of een method van een class zijn. De callback krijgt als parameters de filename en de atributen van de gevonden file.
    De GetFiles functie zet alle gevonden files in de meegegeven TStrings.

    - Path is het pad, eventueel met een mask waarnaar gezocht moet worden, bijvoorbeeld
    'c:\mijn documenten\' voor het zoeken naar alle bestanden in deze map.
    of
    'c:\mijn documenten\*.doc' voor het zoeken naar alle documenten in deze map.
    - Options is een set met zoekopties.
    Enkele opties zijn:

    ~ soRecursive: Zoekt recursief
    ~ soNoDirs: Geeft alleen bestanden terug, geen mappen.
    ~ soDirsOnly: Geeft alleen mapnamen terug, geen bestanden
    Deze optie wordt genegeerd als soNoDirs is gezet.
    ~ soExcludePath: Geeft de bestandsnaam terug zonder pad.
    ~ soRelativePaths: Geeft de bestandsnaam met het relatieve pad.
    Deze optie wordt genegeerd als soExcludePaths is gezet.

    Goed.. Twee simpele voorbeeldjes:
    Op een form staat een listbox, genaamd Listbox1. In de show van het form zet ik de code:
    NLDGetFiles('c:\', ListBox1.Items, [soNoDirs]);
    In de listbox staan nu alle files in de root van C: opgesomd.

    NLDGetFiles('d:\media\audio\*.mp3', ListBox1.Items, [soRecursive, soNoDirs]);
    Zoekt alle mp3 bestanden in d:\media\audio

    Een ander voorbeeld:
    Op een form zet ik een listbox en een button. Een klik op de button start de zoekprocedure. Elke gevonden file wordt teruggeven aan de FoundFile procedure. Deze zet de gevonden files in de listbox en zet de namen van de gevonden mappen in het label, zodat je kunt zien hoe het zoeken vordert.

    Code:
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Listbox1: TListBox;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
      private
    procedure FileFound(const FileName: string; Attr: Integer;
          var DoContinue: TFSContinue);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.DFM}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      NLDEnumFiles('d:\*.txt', FileFound, [soRecursive]);
    end;
    
    procedure TForm1.FileFound(const FileName: string; Attr: Integer;
      var DoContinue: TFSContinue);
    begin
    if Attr and faDirectory <> 0then
    begin
        Label1.Caption := FileName;
        Label1.Refresh;
        Exit;
      end;
      Listbox1.Items.Add(FileName);
    end;
    Natuurlijk zijn er nog veel meer mogelijkheden. Niet alleen zijn er allerlei opties die bij het zoeken kunnen worden meegegeven, maar ook kun je gebruik maken van de TNLDCustomFileSearch class of één van de afgeleiden.

    De unit is te vinden op ftp://ftp.nldelphi.com/public/OpenSo...NLDFileSearch/. De eerste en tot nu toe enige 'officiële' release is NLDFileSearch1.1.1.zip
    Last edited by PsychoMark; 28-Mar-05 at 12:13. Reason: nbsp HTML entities werktte niet meer op vBulletin 3...
    1+1=b

  2. #2

    Exclamation NLDFileSearch versie 1.2

    Eindelijk weer een update, en geen kleine! Hierin zijn de aanpassingen doorgevoerd die zijn voorgesteld in de thread "Recursie zonder recursie: versie 1.1.2".

    Features en optimalisaties (mede door PsychoMark):
    - De recursieve methode is vervangen door PsychoMark's lineaire methode. Voor wie toch de oude methode verkiest boven de nieuwe is de define FSUSERECURSIVE in het leven geroepen. De nieuwe methode is echter beter; de oude methodiek had de kans een stack-overflow te genereren bij een te diepe mappenstructuur.
    - De soProcessMessages optie zorgt ervoor dat na elke loop Application.ProcessMessages wordt aangeroepen. Om dit te kunnen doen is de Forms unit nodig. Om NLDFileSearch ook te kunnen gebruiken in console applicaties of simpelweg applicaties die klein moeten blijven en daarom de Forms unit niet mogen gebruiken, is er de define NOFORMSPLEASE. Deze zorgt dat de Forms unit niet wordt gebruikt. De soProcessMessages optie wordt dan impliciet genegeerd.
    - Er wordt voor het zoeken instantie van TMask aangemaakt. Alle vergelijkingen binnen de zoekopdracht gebruiken dezelfde TMask instantie, zodat deze niet bij elke vergelijking geïnitialiseerd hoeft te worden.
    - De FoundFileEx routines zijn geïmplementeerd. Deze geven niet alleen de bestandsnaam terug, maar het hele search record, waardoor veel meer informatie over het te zoeken bestand is te lezen. Functioneel houdt dit in dat er een nieuw OnFoundFileEx event is, en dat de NLDEnumFiles functies er twee varianten hebben bijgekregen.

    Fix:
    - De vergelijking gaat nu goed om met bestanden zonder extentie en directories. Deze werden door de vorige versie niet allemaal gevonden.

    Nota:
    De protected procedure 'FoundFileHandler' is hernoemd naar 'DoFoundFile'. Ook is in de basisklasse de property 'OnFoundFile' protected gemaakt. E.e.a. om beter in lijn te zijn met de gangbare Delphi coding guidelines. Dit zal overigens normaal gesproken geen problemen opleveren. Wanneer je zelf afgeleiden hebt gemaakt van TNLDCustomFileSearch, dan moet je wellicht enkele minimale aanpassingen doen om je code te kunnen compileren. Deze zijn de moeite waard, dus ga zeker upgraden!

    Versie 1.2 is te downloaden op ftp.NLDelphi.com.
    Last edited by GolezTrol; 29-Mar-04 at 00:59.
    1+1=b

  3. #3
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Zoals beloofd aan GolezTrol ben ik me bezig gaan houden met een helpbestand voor NLDFileSearch. Door middel van uitgebreide in-source comments en Delphi Component Help Builder heb ik dit gerealiseerd en zijn (als 't goed is) alle publieke methodes en properties gedocumenteerd. Bijgesloten zit nu ook een DCHB export in XML formaat, geregistreerde gebruikers kunnen deze importeren. Voor de overigen is het gecompileerde helpbestand inbegrepen, en uiteraard kan je altijd de source raadplegen waar dezelfde informatie in te vinden is.


    Daarnaast heb ik van NLDFileSearch een TComponent gemaakt. Mijn excuses als iemand hier fel op tegen is, maar zie er zelf geen nadelen in (de Classes unit werd toch al gebruikt). Samen met de packages is 't nu dus mogelijk om NLDFileSearch op je form te kwakken en ermee aan de slag te gaan. Om het geheel compatible te houden heb ik een extra constructor geintroduceerd welke automatisch nil als AOwner meegeeft, hierdoor hoeft je code in principe niet te veranderen.

    Ook TNLDStringsFileSearch is hiermee een component geworden, en de bijgesloten demo demonstreert deze aan de hand van een ListBox.



    Versie 1.2.1 is hier te downloaden, en uiteraard ook uit de FreeVCS te halen...
    Qui custodiet ipsos custodes

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. nldfilesearch - file not found
    By sandyman in forum NLDFileSearch
    Replies: 7
    Last Post: 15-Jun-05, 23:06
  2. Replies: 4
    Last Post: 23-Oct-04, 21:46
  3. NLDFileSearch en Filesize
    By Ron in forum Algemeen
    Replies: 15
    Last Post: 22-Jun-04, 14:02
  4. NLDFileSearch
    By alexvdvliet in forum Algemeen
    Replies: 10
    Last Post: 25-Mar-04, 13:08
  5. NLDFileSearch downloaden
    By Kleine83 in forum De website
    Replies: 4
    Last Post: 11-Feb-04, 00:15

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •