SC -- Here's a little convenience routine I wrote as part of
CANTCL which ensures that a directory is mounted either as a regular directory or via
VFS:
# with_mounted_dir --
#
# Since packages can be either inside a regular directory on
# the file system or within some kind of vfs mountable
# archive (or remote location), this wrapper is used to
# perform all operations on packages. It ensures that the given
# directory is readable, mounting it with tclvfs if needed.
#
# Arguments:
# dir -- a directory or archive
# body -- code to run with dir guaranteed to be mounted
# "except" -- the word except, introduces optional exception block
# exceptblock -- code to execute if the dir can't be mounted for some
# reason
# Results:
# Returns the result of evaluating the body or exceptblock in the caller's
# context
#
proc with_mounted_dir {dir body {"except" {}} {exceptbody {}}} {
variable mountpoints
if {[file isdirectory $dir]} {
return [uplevel 1 $body]
} else {
# we need to try to mount it with tclvfs
# the file system types we know about
set vfstypes {zip mk4 tar}; # also: ftp http webdav
set mounted {}
foreach fs $vfstypes {
if {![catch {
package require vfs::$fs
set mountpoint [vfs::${fs}::Mount $dir $dir]
} fp]} {
set mounted $fs
break
}
}
if {$mounted != {}} {
catch {uplevel 1 $body} result
# now unmount before leaving
vfs::${mounted}::Unmount $mountpoint $dir
return $result
}
}
# if we're here we couldn't mount the dir
return [uplevel 1 $exceptbody]
}
I realise this isn't as robust as it might be in running the body code — any suggestions appreciated.
And here's an example:
set dir /path/to/starkit.kit
with_mounted_dir $dir {
set files [glob -join $dir *]
puts "Files in starkit are: $files"
}