seanhart Posted August 2, 2004 Share Posted August 2, 2004 My first posting to this site, thought I would contribute a UDF that seems pretty useful to me. This enumerates all files in a directory (and subdirectories if desired). The depth of subfolders is limited to the number of files that can be open at once in AutoIt. Also included is a function to resize an array on the fly. Excuse all the comments but I prefer to do too much instead of too little! expandcollapse popup;=============================================================================== ; ; Description: Enumerates all files in the specified folder and subfolders ; (if required), along with size of all files ; Syntax: EnumFiles( $folder, $recurse ) ; Parameter(s): $folder - Path to the folder to get files from ; $recurse - 0 to exclude subfolders, 1 to include subfolders ; Requirement(s): None ; Return Value(s): On Success - Returns array containing files ; array[0] contains number of files ; array[array[0] + 1] contains size of all files ; On Failure - Returns 0 and sets @ERROR = -1 ; Author(s): Sean Hart (autoit@hartmail.ca) ; Note(s): None ; ;=============================================================================== func EnumFiles ($folder, $recurse) ; Declare variables Dim $FileList [100], $curdir, $arraysize, $filesize, $curdir, $x, $search, $file ; Keep track of size of array $arraysize = 100 ; Keep track of size of each file $filesize = 0 ; Remember the current directory $curdir = @WorkingDir ; Check that the folder exists, otherwise return 0 and set errorlevel if not FileExists ($folder & "\") then SetError (-1) Return 0 endif ; Change the directory to the specified folder FileChangeDir ($folder) ; Start searching the current folder for files & directories $search = FileFindFirstFile ("*.*") $file = FileFindNextFile ($search) ; While files are found, loop while @error = 0 ; if a directory is found, process it as such if (StringInStr (FileGetAttrib ($file), "D")) then ; If recurse options is used and directory is not a root folder, process it if $recurse and ($file <> ".") and ($file <> "..") then ; Recursively call this function to return an array of files in the subfolder(s) $subfiles = EnumFiles ($folder & "\" & $file, 1) ; Check number of files returned, and resize array if required if $subfiles[0] + 2 > $arraysize then $arraysize = $arraysize + $subfiles[0] + 100 ResizeArray ($FileList, $arraysize) endif ; Loop through array of files in subfolder and add to current file list for $x = 1 to $subfiles[0] ; If number of files reaches array size, resize it if $FileList[0] + 1 = $arraysize then $arraysize = $arraysize + 100 ResizeArray ($FileList, $arraysize) endif ; Add 1 to number of files and add file to file list $FileList[0] = $FileList[0] + 1 $FileList[$FileList[0]] = $subfiles[$x] next ; Add size of subfolder to size of current file list $filesize = $filesize + $subfiles[$subfiles[0] + 1] endif ; If a file is found (not a directory), process it else ; If number of files reaches array size, resize it if $FileList[0] + 1 = $arraysize then $arraysize = $arraysize + 100 ResizeArray ($FileList, $arraysize) endif ; Add 1 to number of files $FileList[0] = $FileList[0] + 1 ; Add full path to file to the file list $FileList[$FileList[0]] = $folder & "\" & $file ; Add size of file to the total file size $filesize = $filesize + FileGetSize ($file) endif ; Find next file $file = FileFindNextFile ($search) wend ; Close search handle FileClose ($search) ; Add size of all files to array $FileList[$FileList[0] + 1] = $filesize ; Change back to the original directory FileChangeDir ($curdir) ; Return array of files Return $FileList EndFunc ;=============================================================================== ; ; Description: Resizes an array to the specified size ; Syntax: ResizeArray( $array, $size ) ; Parameter(s): $array - Array to resize (array) ; $size - New size of array (integer) ; Requirement(s): array(0) must hold current size of array or position of last ; value. ; Return Value(s): none ; Author(s): Sean Hart (autoit@hartmail.ca) ; Note(s): If new size is smaller than old size, any entries beyond new ; size will be lost. ; ;=============================================================================== func ResizeArray (ByRef $array, $size) ; Declare variables Dim $temparray[$size], $x, $numentries ; Find which size is bigger (old or new), figure out how many entries to copy if $array[0] > $size then $numentries = $size else $numentries = $array[0] endif ; Loop through original array copying each entry to temporary array for $x = 0 to $numentries $temparray[$x] = $array[$x] next ; Clear original array $array = 0 ; Copy entire temporary array back to original array, so it takes on new diminension $array = $temparray ; Clear temporary array $temparray = 0 EndFunc Link to comment Share on other sites More sharing options...
Guest Doflow Posted August 5, 2004 Share Posted August 5, 2004 Good stuff!! Thanks. Doflow Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now