This is a relatively common request. Someone wants, for one reason or another, to determine how much diskspace is currently in use. While on Unix one could say "exec /bin/du" , that doesn't do well for a cross platform solution. Here's an attempt to provide some Tcl code to do this. However, I'm uncertain whether the calculation is correct. Perhaps some of my fellow [Tcl'ers] can look in here and determine whether my algorithm is correct. ---- #! /usr/tcl84/bin/tclsh8.4 # Name: du.tcl # Purpose: # Given a directory, calcuate the number of bytes of plain files within # the directory # Author: lvirden@yahoo.com # Date: Sept. 26, 2002 # Version: 1.0 package require log log::lvChannel debug stderr proc dirsize {directory} { if { [file exists $directory ] == 0 } { return 0 } if { [file readable $directory ] == 0 } { return 0 } set size 0 set noaccess {} foreach element [glob -nocomplain -directory $directory -types f *] { set path [file join $directory $element] if { [file readable $path] } { array unset stats file stat $path stats incr size $stats(size) } else { lappend noaccess $path } } if { [llength $noaccess] != 0 } { log::log debug $noaccess } return $size } proc dir_totalsize {directory} { if { [file exists $directory ] == 0 } { return 0 } if { [file readable $directory ] == 0 } { return 0 } set size 0 set noaccess {} foreach element [glob -nocomplain -directory $directory -types d *] { set path [file join $directory $element] if { [file readable $path] } { incr size [dirsize $element] } else { lappend noaccess $path } } if { [llength $noaccess] != 0 } { log::log debug $noaccess } return $size } # Test out implementation if { [file exists /tmp/small] == 0 } { exec mkdir /tmp/small exec cp /etc/motd /tmp/small/motd } puts [format "Size of /tmp/small is %d" [dirsize /tmp/small] ] puts [format "Size of %s is %d" $env(HOME) [dirsize $env(HOME)] ] puts [format "Size of /not/present is %d" [dirsize /not/present] ] puts [format "Total size of %s is %d" $env(HOME) [dir_totalsize $env(HOME)] ] ---- Well, please forgive me, I felt like writing a competeing version since this ''is'' something I needed too. see [du] '''-PSE''' ---- [Martin Lemburg] - 27.09.2002: The proc du in [du] is something complete different than "dirsize" and "dir_totalsize". But I tried out your procs and got results, that differ completely from the reality. I tried out following: % dirsize g:/programme 22351 % dir_totalsize g:/programme 12651754 With the following proc "dirSize" ... proc dirSize {obj {recursive 0}} { set size 0; foreach subObj [glob -nocomplain \ [file join $obj *] \ [file join $obj {.[a-zA-Z0-9]*}]] { if {$recursive && [file isdirectory $subObj]} { incr size [dirSize $subObj 1]; } else { incr size [file size $subObj]; } } return $size; } ... I got following: % dirSize g:/programme 22351 % dirSize g:/programme 1 279744410 My explorer tells me (inklusive of all hidden files/directories) 289.795.331 Bytes. So something goes wrong in your proc "dir_totalsize" ---- Yes, unfortunately the dir_totalsize doesn't recurse. And I'm having computer problems today which prevent me from making adjustments to the script...