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):
%3 ad_file ad_file (public) util::find_all_files util::find_all_files util::find_all_files->ad_file

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 $files
XQL Not present:
PostgreSQL, Oracle
Generic XQL file:
packages/acs-tcl/tcl/utilities-procs.xql

[ hide source ] | [ make this the default ]
Show another procedure: