Version 1 of Another little file search

Updated 2006-04-11 14:59:48

Two problems: 1. speed 2. progressVar is not updated if level > 0


proc GetFileList {path args} {

        if {[lindex $args 0] != 0 && [lindex $args 0] != 1} {
                set level 0
        } else {
                set level [lindex $args 0]
                set args [lrange $args 1 end]
                if {$level == 1} {
                        set searchRecursiv 1
                        while {[llength $args] > 0} {
                                set opt [lindex $args 0]
                                switch -- $opt {
                                        -progressVar {
                                                upvar #0 [lindex $args 1] progressVar
                                                set args [lrange $args 2 end]
                                        }
                                        default {
                                                return -code error "unknown option '$opt'"
                                        }
                                }
                        }
                }
        }
        if {$level == 0} {
                set extOK 0
                set relPath 1
                set searchRecursiv 1
                set regExp ".*"
                #puts stderr "args'$args' -> '[llength $args]'"
                while {[llength $args] > 0} {
                        set opt [lindex $args 0]
                        switch -- $opt {
                                -ext {
                                        set ext [lindex $args 1]
                                        set extOK 1
                                        set args [lrange $args 2 end]
                                }
                                -relPath {
                                        set relPath [lindex $args 1]
                                        set args [lrange $args 2 end]
                                }
                                -recursiv {
                                        set searchRecursiv [lindex $args 1]
                                        set args [lrange $args 2 end]
                                }
                                -progressVar {
                                        upvar #0 [lindex $args 1] progressVar
                                        set args [lrange $args 2 end]
                                }
                                -regExp {
                                        set regExp [lindex $args 1]
                                        set args [lrange $args 2 end]
                                }
                                default {
                                        return -code error "unknown option '$opt'"
                                }
                        }
                        #puts stderr "args'$args' -> '[llength $args]'"
                }
        }
        set fileList ""
        set fL ""
        set path [Backslash2Slash $path]
        set all [glob -nocomplain $path/*]
        dputs "all 'glob -nocomplain $path/*' -> '$all'"
        foreach f $all {
                update idletasks
                if {[file isdirectory $f]} {
                        set progressVar $f;update
                        if $searchRecursiv {
                                set temp [GetFileList $f 1 -progressVar progressVar]
                                foreach t $temp {
                                        lappend fL $t
                                }
                        }
                } else {
                        lappend fL $f
                }
        }
        if {$level == 0} {
                foreach f $fL {
                        if {![regexp $regExp $f]} {continue}
                        if $extOK {
                                dputs "checke extension '$ext' bei '$f' -> '[file extension $f]'"
                                set isExt [string range [file extension $f] 1 end]
                                if {[lsearch [string tolower $ext] [string tolower $isExt]] == -1} {
                                        continue
                                }
                        }
                        if $relPath {
                                regsub -- "$path/" $f "" f
                        }
                        lappend fileList $f
                }
        } else {
                set fileList $fL
        }
        return $fileList

}