Updated 2014-06-02 20:39:34 by dkf

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
         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"