- speed
- progressVar is not updated if level > 0 (recursive search)
- it has to work with tcl 8.0
########################################################################################################
# proc : GetFileList
# written by : Enrico Herzke
# Datum : 2001
########################################################################################################
# Funktion: Liefert Liste aller Dateien in einem Verzeichnis inkl. Unterverzeichnisse
# Aufruf: GetFileList path ?args?
# Eingabe: [I] path - zu durchsuchendes Verzeichnis
# [I] -ext - Liste von einer oder mehreren Extensions ohne Punkt,
# nach denen gesucht wird
# z.B.: '-ext h' oder '-ext "h cpp"'
# [I] -relPath - 0 -> liefere kompletten Pfad
# 1 -> liefere relativen Pfad (default)
# [I] -recursiv - 0 -> nur den uebergebenen Pfad durchsuchen
# 1 -> alle Unterverzeichnisse durchsuchen (default)
# Ausgabe: keine
# Rückgabe: Fileliste
# Hinweis: - wird keine Extension (Option -ext) angegeben, werden alle Dateien zurueckgeliefert,
# es werden nur relative Pfadangaben der gefundenen Dateien zurueckgegeben
# - gibt man den Pfad mit abschließendem Slash an, wird der komplette Pfad zurueckgeliefert
# Beispiel:
#
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
}MHo: You may also take a look at Matthias Hoffmann - Tcl-Code-Snippets - misc - globx.
globx is ok, but works not on tcl 8.0 which I need!

