util::find_all_files (public)
util::find_all_files [ -include_dirs include_dirs ] \ [ -max_depth max_depth ] [ -check_file_func check_file_func ] \ [ -extension extension ] -path path
Defined in packages/acs-tcl/tcl/utilities-procs.tcl
Returns a list of lists with full paths and filename to all files under $path in the directory tree (descending the tree to a depth of up to $max_depth). Clients should not depend on the order of files returned. DOES NOT WORK ON WINDOWS (you have to change the splitter and I don't know how to detect a windows system)
- Switches:
- -include_dirs (optional, defaults to
"0"
)- Should directories be included in the list of files.
- -max_depth (optional, defaults to
"1"
)- How many levels of directories should be searched. Defaults to 1 which is the current directory
- -check_file_func (optional)
- Function which can be executed upon the file to determine if it is worth the effort
- -extension (optional)
- Only return files with this extension (single value !)
- -path (required)
- The path in which to search for the files. Note that this is an absolute Path
- Returns:
- list of lists (filename and full_path) of all files found.
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
Source code: # Use the examined_files array to track files that we've examined. array set examined_files [list] # A list of files that we will return (in the order in which we # examined them). set files [list] # A list of files that we still need to examine. set files_to_examine [list $path] # Perform a breadth-first search of the file tree. For each level, # examine files in $files_to_examine; if we encounter any directories, # add contained files to $new_files_to_examine (which will become # $files_to_examine in the next iteration). while { [incr max_depth -1] > -2 && [llength $files_to_examine] != 0 } { set new_files_to_examine [list] foreach file $files_to_examine { # Only examine the file if we haven't already. (This is just a safeguard # in case, e.g., Tcl decides to play funny games with symbolic links so # we end up encountering the same file twice.) if { ![info exists examined_files($file)] } { # Remember that we've examined the file. set examined_files($file) 1 if { $check_file_func eq "" || [$check_file_func $file] } { # If it's a file, add to our list. If it's a # directory, add its contents to our list of files to # examine next time. set filename [lindex [split $file "/"] end] set file_extension [lindex [split $filename "."] end] if { [ad_file isfile $file] } { if {$extension eq "" || $file_extension eq $extension} { lappend files [list $filename $file] } } elseif { [ad_file isdirectory $file] } { if { $include_dirs == 1 } { lappend files $file } lappend new_files_to_examine {*}[glob -nocomplain "$file/*"] } } } } set files_to_examine $new_files_to_examine } return $filesXQL Not present: PostgreSQL, Oracle Generic XQL file: packages/acs-tcl/tcl/utilities-procs.xql