Mappen scannen met FileFindFirstFile in AutoIt

AutoIt-bestanden zoeken in een map met FileFindFirstFile

Met FileFindFirstFile zoek je in AutoIt de eerste bestandsnaam in een map.Daarna pak je de rest met FileFindNextFile. Klaar met zoeken? dan moet je de zoekhandle sluiten met FileClose. Dat laatste is belangrijk, anders laat je de zoekactie open staan.

Kort probleem

Soms wil je niet één vast bestand openen, maar alle bestanden in een map vinden. Denk aan een map met foto’s, tekstbestanden of rapporten. Je weet vooraf niet welke namen erin zitten.

Dan is FileFindFirstFile handig. Die geeft je een beginpunt. Daarna lees je stuk voor stuk de andere matches uit de map met FileFindNextFile.

Dit doen de drie functies

De bron draait om drie functies:

  • FileFindFirstFile – start het zoeken in een map
  • FileFindNextFile – haal het volgende bestand op
  • FileClose – sluit de zoekhandle netjes af

Een handle is een soort toegangsbewijs. AutoIt gebruikt dat om bij dezelfde zoekactie te blijven. Zie het als een kaartje voor dezelfde deur. Zolang je dat kaartje hebt, kun je verder zoeken.

Hoe werkt het stap voor stap?

Eerst geef je een pad met een zoekpatroon. Dat patroon kan bijvoorbeeld *.txt zijn als je alle tekstbestanden wilt vinden. De functie geeft dan een handle terug.

Daarna lees je steeds het volgende bestand met FileFindNextFile.Je blijft dat doen tot er geen bestand meer terugkomt. Dan stopt de lus.

tot slot sluit je de handle met FileClose. Dat is de nette afsluiting.Zonder dat sluit je de zoekbron niet goed af.

Wat je terugkrijgt

Hier is het simpel uitgelegd:

StapFunctieWat je krijgt
StartFileFindFirstFileeen handle of een fout
Volgende bestandsnaamFileFindNextFilede volgende naam
StoppenFileClosezoekhandle dicht

Als het zoeken niet lukt, geeft

FileFindFirstFile

-1

terug. Dan moet je eerst kijken of het pad klopt of dat het zoekpatroon goed is.

Voorbeeldcode

Local $hSearch = FileFindFirstFile("C:Temp*.txt")

If $hSearch = -1 Then
    MsgBox(16, "Fout", "Geen bestanden gevonden of map niet bereikbaar.")
Else
    While 1
        Local $sFile = filefindnextfile($hSearch)
        If @error Then ExitLoop

        MsgBox(64, "Bestand", $sFile)
    WEnd

    FileClose($hSearch)
EndIf

Wat doet deze code precies?

De eerste regel zoekt naar alle .txt-bestanden in C:Temp. Als dat niet lukt,krijgt de variabele $hSearch de waarde -1. Dan laat de code een foutmelding zien.

Als het zoeken wel lukt, gaat de code door in de While-lus. Elke ronde haalt FileFindNextFile de volgende bestandsnaam op. Zodra er niets meer is, zet AutoIt een foutstatus via @error en stopt de lus.

Daarna komt het belangrijke deel: FileClose($hSearch). Daarmee sluit je de zoekhandle. Dat hoort altijd, ook als je maar een paar bestanden hebt gevonden.

Waar moet je op letten?

1. Sluit de handle altijd

Dit is de belangrijkste regel. Als je de handle open laat, werk je niet netjes.Sluit hem dus na het zoeken met

FileClose

.

2. Controleer op -1

FileFindFirstFile

kan mislukken. Dan krijg je

-1

terug. Dat kan komen door een fout pad, geen toegang of geen matchende bestanden.

3. Gebruik een goed patroon

Een patroon zoals

*.txt

betekent: alle bestanden met die eindiging. Je kunt ook een andere naamvorm zoeken als dat past bij je map.

4. Verwar de functies niet

FileFindFirstFile

start de zoekactie.

FileFindNextFile

gaat verder.

FileClose

eindigt het geheel. Het zijn dus drie losse stappen.

Kleine uitbreiding

Soms wil je niet alleen de naam laten zien, maar iets met elk bestand doen. Denk aan alleen de namen opslaan of een vaste actie starten per bestand. Dan blijft de volgorde hetzelfde: eerst zoeken, dan telkens de volgende naam pakken, en daarna sluiten.

Een kleine basis die vaak helpt is dit:

Local $hSearch = FileFindFirstFile("C:Temp*.*")

If $hSearch = -1 Then
    Exit
EndIf

While 1
    Local $sFile = FileFindNextFile($hSearch)
    If @error then ExitLoop

    ; doe hier iets met $sFile
WEnd

FileClose($hSearch)

Hier zie je het patroon nog duidelijker. Eerst de start, dan herhalen, dan netjes afsluiten.

veelgemaakte fout

De fout die het vaakst terugkomt: FileClose vergeten. Dat voelt klein,maar het is toch belangrijk. De zoekhandle blijft dan open totdat je script stopt.

Een andere fout is denken dat FileFindFirstFile meteen een lijst geeft. Dat doet hij niet. Hij geeft alleen de eerste stap voor de zoekactie.Daarna moet je zelf verder gaan met FileFindNextFile.

Snelle samenvatting

Zo pak je het aan:

  1. Start met FileFindFirstFile
  2. Controleer op -1
  3. Lees bestanden één voor één met FileFindNextFile
  4. Stop als @error zegt dat er niets meer is
  5. Sluit de handle met fileclose

Dat is de hele kern.Niet meer dan dat, maar wel netjes gedaan.

Documentatie

Voor de bron of extra uitleg kun je ook terecht op Mappen scannen met FileFindFirstFile in AutoIt.

Bevers gedachte

Bestanden zoeken klinkt soms groter dan het is.Maar de basis is gewoon: open, lees, dicht. Als je dat ritme volgt, blijft je autoit-code prettig en rustig.En ja, ook een zoekhandle wil af en toe gewoon netjes naar bed 🦫