jima 2014-01-27
I paste here the proc (
GetFilePaths) I have to generate listings of files (following possibly a pattern) and folders given some starting folder.
This proc uses another auxiliary one (
MakeRelative) in the cases full paths are not needed but relative ones.
I reckon the names given to possible options and their possible values are perhaps unfortunate because of the hyphens.
proc GetFilePaths {
filePath
{-expected {-expectedFiles -expectedFolders}}
{pattern *}
{-makeRelative -makeRelativeNo}
{-recursive ""}
} {
set result ""
if {${-recursive} ne "-recursiveNo"} {
foreach folder [glob -nocomplain -type d -dir $filePath *] {
if {${-recursive} eq ""} {
lappend result {*}[GetFilePaths \
$folder ${-expected} $pattern ${-makeRelative} $filePath
]
} else {
lappend result {*}[GetFilePaths \
$folder ${-expected} $pattern ${-makeRelative} ${-recursive}
]
}
if {"-expectedFiles" in ${-expected}} {
foreach file [glob -nocomplain -type f -dir $folder $pattern] {
if {${-makeRelative} eq "-makeRelativeYes"} {
lappend result [
MakeRelative $filePath $file ${-recursive}
]
} else {
lappend result $file
}
}
}
if {"-expectedFolders" in ${-expected}} {
if {${-makeRelative} eq "-makeRelativeYes"} {
lappend result [
MakeRelative $filePath $folder ${-recursive}
]
} else {
lappend result $folder
}
}
}
}
if {
(
(${-recursive} eq "") ||
(${-recursive} eq "-recursiveNo")
) && ("-expectedFiles" in ${-expected})
} {
foreach file [glob -nocomplain -type f -dir $filePath $pattern] {
if {${-makeRelative} eq "-makeRelativeYes"} {
lappend result [MakeRelative $filePath $file ${-recursive}]
} else {
lappend result $file
}
}
}
if {
(${-recursive} eq "-recursiveNo") &&
("-expectedFolders" in ${-expected})
} {
foreach file [glob -nocomplain -type d -dir $filePath $pattern] {
if {${-makeRelative} eq "-makeRelativeYes"} {
lappend result [MakeRelative $filePath $file ${-recursive}]
} else {
lappend result $file
}
}
}
return $result
}
proc MakeRelative {filePath file {-recursive ""}} {
set result {}
if {${-recursive} eq "" || ${-recursive} eq "-recursiveNo"} {
set prefix $filePath
} else {
set prefix ${-recursive}
}
set first [string first $prefix/ $file]
if {$first == -1} {
set result $file
} else {
set result [string range $file [string length $prefix/] end]
}
return $result
}
Some examples:
Get all files and folders that hang from a given folder.
set filesAndFolders [GetFilePaths $folder]
Get all files (but not folders) that hang from localFolder and follow the pattern *.IN.
set inFiles [GetFilePaths $localFolder -expectedFiles *.IN]