Scanning+a+Directory+(Reading+Directory+Entries)

//by JGH, 03-Jan-2008//

The Windows API functions **FindFirstFile** and **FindFileNext** can be used to scan a directory to find what files and subdirectories exist within it. The BBC BASIC for Windows manual contains some [|simple demonstration code] to do this.

Tree Walking
It is a simple modification to the code to "tree walk", that is to recursively descend into subdirectories from a specified starting point. The following pair of subroutines do this: code format="bb4w" DEF PROCScan_Dir(path$) LOCAL dir%, sh%, res% DIM dir% LOCAL 317                             :REM Reserve local space for file info IF RIGHT$(path$)<>"\" THEN path$+="\"          :REM Ensure path$ is a path SYS "FindFirstFile", path$+"*.*", dir% TO sh%  :REM Initialise search IF sh% <> -1 THEN REPEAT PROCScan_Object                            :REM Process the object we have found SYS "FindNextFile", sh%, dir% TO res%      :REM Step to next object UNTIL res% = 0                               :REM Loop until no more found SYS "FindClose", sh% ENDIF ENDPROC DEF PROCScan_Object LOCAL file$ file$=$$(dir%+44)                              :REM Extract object name :     IF file$="." OR file$=".." THEN ENDPROC        :REM Skip 'this' and 'parent' entries :     REM Put code here that processes directories before descending into them :     IF (dir%!0 AND 16) THEN PROCScan_Dir(path$+file$+"\") :REM Recurse into and return :REM from subdirectories :     REM Put code here that processes directories after returning up      REM from them and code that processes files REM REM dir% contains the object's meta data: REM dir%!0 - Object attributes: REM         1 = read only REM         2 = hidden REM         4 = system REM        16 = directory REM        32 = archive REM       Other bits are used for specialised purposes. The values may be combined. REM dir%!4 - Time created (LS 32 bits) REM dir%!8 - Time created (MS 32 bits) REM dir%!12 - Time last accessed (LS 32 bits) REM dir%!16 - Time last accessed (MS 32 bits) REM dir%!20 - Time last modified (LS 32 bits) REM dir%!24 - Time last modified (MS 32 bits) REM dir%!28 - File size in bytes (MS 32 bits) REM dir%!32 - File size in bytes (LS 32 bits) REM $$(dir%+44) - object leaf name :     :      ENDPROC code For example, calling with **PROCScan_Dir("C:\Program Files")** will recursively scan all the subdirectories within //C:\Program Files//.

See [|TreeScan.bbc] in the BB4W Yahoo! Group [|file area].

Technical Note
When scanning a directory you can never guarantee that the list you get is 100% accurate. Some other process may change the directory while your program is going through it. This is not a flaw in Windows, this is a fundamental problem encountered when multiple processes are able to have interleaved access to the same resource and more than one of them is able to change it. Do not worry too much about this, in almost 100% of cases this will not be a problem.