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 mapFileFindNextFile– haal het volgende bestand opFileClose– 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:
| Stap | Functie | Wat je krijgt |
|---|---|---|
| Start | FileFindFirstFile | een handle of een fout |
| Volgende bestandsnaam | FileFindNextFile | de volgende naam |
| Stoppen | FileClose | zoekhandle 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:
- Start met
FileFindFirstFile - Controleer op
-1 - Lees bestanden één voor één met
FileFindNextFile - Stop als
@errorzegt dat er niets meer is - 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 🦫
