Recursive Functions
Recursive User-Defined Functions
Can BCX handle recursive functions?
No problem! Here's a popular example.
' Example function call usage 1
'SearchForFiles("C:\", "win.ini")
' Example function call usage 2
SearchForFiles(
"C:\Windows"
,"Notepad.exe"
)
SUB
SearchForFiles(
startPath$, FileToFind$)
DIM
RAW
fPath$, wildpath$, fName$, fPathName$DIM
RAW
hfindAS
HANDLEDIM
RAW
WFDAS
WIN32_FIND_DATADIM
RAW
foundAS
BOOLeanDIM
RAW
filename$' Prepare filename$ for comparison with found file names
filename$=
LCASE$
(
FileToFind$)
' Make a local copy of the search path
fPath$=
startPath$' Make sure search path ends with a backslash
IF
RIGHT$
(
fPath$,1
)
<>"\"
THEN
fPath$=
fPath$+
"\"
' We want to find all files and folders so we'll
' add a wildcard asterisk to the search path
wildpath$=
fPath$+
"*"
' Ask Windows API for first file or folder
' in our search path
hfind=
FindFirstFile(
wildpath$,&
WFD)
' Did we get one?
IF
hfind !=
INVALID_HANDLE_VALUETHEN
found=
TRUEELSE
found=
FALSEEND
IF
DO
WHILE
found' Get the name of the file or folder
' from the WIN32_FIND_DATA structure
fName$=
WFD.cFileName' Add the file or folder name to the search path
fPathName$=
fPath$+
fName$IF
fName$ !=
"."
THEN
' ignore "current folder"
IF
fName$ !=
".."
THEN
' ignore "parent folder"
' Did we find a file or a folder?
IF
(
WFD.dwFileAttributesBAND
FILE_ATTRIBUTE_DIRECTORY)
THEN
' Found a folder so look for our target
' file in that folder
SearchForFiles(
fPathName$, filename$)
' Found a file so does it match our target?
ELSEIF
LCASE$
(
fName$)
=
filename$THEN
' Code here could call another routine,
' add the found file to a listbox,
' or whatever. We'll just display it's
' full path and name in a message box
"Found "
, fPathName$ELSE
' File searching can be a lengthy process
' so give other processes a chance to do
' whatever they need to do
DOEVENTS
END
IF
END
IF
END
IF
' Ask Windows API for the next file or
' folder in our search path
found=
FindNextFile(
hfind,&
WFD)
LOOP
' Tell Windows API we've finished searching
FindClose(
hfind)
END
SUB