MB: This is a simple mega-widget to display largest files than a given limit. It is based on snit, on the fileutil package and on the hrfilesize package, which can be found one the file size page. The icons are given by the excellent icons package. The user can customize :
It should be able to handle large files over than 2 GB, but I did not check that. I use it to make some space on my hard drives.
#
# largestfilesview
# A mega-widget to display files larger/lesser than a given limit.
#
# Copyright: Michael Baudin, 2008, [email protected]
#
package require snit
package require hrfilesize
package require Tk
package require fileutil
package require BWidget
package provide largestfilesview 1.0
snit::widget largestfilesview {
variable wtext
variable imageopen
variable directoryname [pwd]
variable sizelimit 1
variable sizelimitunit MB
variable sizeoperator min
variable imagerun
option -directoryentrywith -default 70
constructor {} {
set imageopen [image create photo -data {
R0lGODlhGAAYAIYAAPwCBJTW7IzK7HS23Gyi1FSOxKTi9Jzi9JzW9ITG5GSi
zDx2tCxirBRClKTi/BxOnAQ6jAxClER6vBxy5CRy5Hyu5HSu5AQibDSK1DyK
1DSC1Gym5CyCzCR2zCxqzCRqxGSm3Iy67GSm5GSi3Byu7AQ2jFSe3BxyxEyW
3ByW3ITS9ITS7AxqvESS1GTC7AQ6lFya1BSCzEyy7ESy5CR25EyS3BRmxCyi
3Bx2zDSi5FSKzAxatBRavFx6tLzK5Ky+3LTG5MzW7Mza9NTi9OTq9PT2/FyO
zLTC5LzO7PTy/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAA
LAAAAAAYABgAAAf/gACCg4MBAgMEBYSLjIIGBwgJAwoFCwwADY2LDgaMlg8Q
moOdmgwPEaKpABKmqI0TFLGqmhQVFrcXs4sTFhgZGMAXwsPDmrwayMnKyrmM
ExscHRweH9TUHx8T1djcoQATIB3iEyEiIiAb5yMiGyQHBvAlghMmJx0fFiYo
Jvr8/ikqVqiQN8/EBxYeNqBogaIhw4YYUriY+GLQBBgs6KGI0QJZCmUtYsiY
4U0QjRo2PpjokCxGSw0xYtwgQXBejQ81xOHosJPnBJ40WOSoKYiCjg87eOxY
qnSpU6cVCU3Q0cPHDyBXfQQJImQIESJFikSVauTI1RBHfCBBIkTI17BFJYjO
s4rVqg+tXL0SSSJX0IsSf/9CKDH4BYTAhHUpXsy4MSFwgQAAIf5oQ3JlYXRl
ZCBieSBCTVBUb0dJRiBQcm8gdmVyc2lvbiAyLjUNCqkgRGV2ZWxDb3IgMTk5
NywxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KaHR0cDovL3d3dy5kZXZl
bGNvci5jb20AOw==
}]
set imagerun [image create photo -data {
R0lGODlhFgAWAIYAAPwCBFxWlDw6fExGhJyezDw2dFRSlHx6tISCtGRenFxe
nGxqpHRurIR+tJSOxIyKvNTS7GRinDQ2dFRWlCwqZExGjGxupIyOvJSOvJSS
xMzO5HRyrMTC5OTi9LS23KSezKSizLSu1DQydKyqzLSy1KSi1Kyq1Kyu1MS+
5Ly63MzK7IyGvFxWnMS+3MzK5FROjExOjNza7ISCvGxmpMTC3Kym1GRmpHx2
rMzG5NTO7IyKxExKjMTG5PTu/JyazOTe9Pz6/Ozm9Pz2/Pz+/JyaxPT2/Fxa
nNzW7Ozu/Nza9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAA
LAAAAAAWABYAAAf/gACCg4MBAoMDBISLiwUDBgIGAwcICYyMBQYKCwwHDQ4P
EBGXABITFBUVEwoWCBcYGRoZBYwSAgMCGxwdEB4ODh8gIRmHi7ciIx0kGQ8X
IB8lJicoEBbGAikqICsMLAICJCEhKS0uLi+DEjAIMRkyCgIigjMkKTQuEBAG
ggUJLzE1HiQoJsiGPRUQYtD4EClChBsQMswgKGgDCoQuanx48M2ChQw4EFAE
wIBGDgg4QOhgkMDUggMHcNyQN2gDjXwdQDywEU/Qjgc6ShwgyIAHzh4lGAhQ
MAiGDh8fTAwAsMBmvh8dgLiIIIHQBKgmTHCwgANfjA5BhAyBAIMQkWDRWVKk
4IAPaxEgQ3CYIBKAkBEOKjikwKHiSAwcJEx0cGEiww0KixZ8yAABXwcOG2/c
yACCwQ6ahHBl6IAkicqJAgZSGJkOQAMXKD4o7Uvq0gRmA2vXttVVN51AACH+
aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVs
Q29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93
d3cuZGV2ZWxjb3IuY29tADs=
}]
}
destructor {
image delete $imageopen
image delete $imagerun
}
#
# draw --
# Draw the dialog
#
method draw {} {
#
# The toolbar contains buttons
#
set toolbar [frame $win.toolbar]
pack $toolbar -anchor nw
button $toolbar.diropen \
-image $imageopen \
-relief flat \
-command [mymethod opendirectory]
button $toolbar.runsearch \
-image $imagerun \
-relief flat \
-command [mymethod searchfiles]
pack $toolbar.diropen $toolbar.runsearch -anchor nw -side left
#
# Pack an entry to display the directory name
#
set directorybar [frame $win.directorybar]
pack $directorybar -anchor nw
label $directorybar.dirnamelabel \
-text "Directory:"
entry $directorybar.dirnameentry \
-textvariable [myvar directoryname] \
-width $options(-directoryentrywith)
pack $directorybar.dirnamelabel $directorybar.dirnameentry -anchor nw -side left
#
# Pack widgets to set the (min,max), file size unit, and file size limit
#
set sizebar [frame $win.sizebar]
pack $sizebar -anchor nw
label $sizebar.sizelabel \
-text "Size:"
tk_optionMenu $sizebar.sizeunitom \
[myvar sizelimitunit] \
B KB MB GB TB EB
tk_optionMenu $sizebar.sizeoperator \
[myvar sizeoperator] \
min max
scale $sizebar.sizescale \
-from 1 \
-to 1000 \
-variable [myvar sizelimit] \
-orient horizontal \
-showvalue 0 \
-resolution 1
entry $sizebar.sizeentry \
-textvariable [myvar sizelimit]
pack $sizebar.sizelabel $sizebar.sizeoperator \
$sizebar.sizeunitom $sizebar.sizescale $sizebar.sizeentry -anchor nw -side left
#
# Pack a scrollable text to log messages
#
ScrolledWindow $win.scrolltext
pack $win.scrolltext
set wtext [text $win.thetext \
-wrap none]
$win.scrolltext setwidget $wtext
}
#
# opendirectory --
# Let the user select the directory to explore
#
method opendirectory {} {
set dirname [tk_chooseDirectory \
-initialdir $directoryname]
if {$dirname!=""} then {
set directoryname $dirname
}
}
#
# searchfiles --
# Search the files matching the criteria.
#
method searchfiles {} {
$self log "Searching files in $directoryname..."
#
# Compute the list of files
#
set listoffiles [::fileutil::find $directoryname [mymethod filterfile]]
set nbfiles [llength $listoffiles]
$self log "Number of files over the minimum : $nbfiles"
#
# Sort files by size
#
set datatosort {}
foreach filename $listoffiles {
set size [file size $filename]
set data [list $filename $size]
lappend datatosort $data
}
set sorteddata [lsort -decreasing -index 1 -integer $datatosort]
#
# Display the sorted files matching the filter
#
foreach data $sorteddata {
set filename [lindex $data 0]
set size [lindex $data 1]
set hrsize [hrfilesize::bytestohr $size]
$self log "$hrsize \t $filename "
}
}
#
# filterfile --
# Returns 1 if the file is to keep in the list or 1 if the file is to
# exclude from the list.
#
method filterfile {filename} {
set isfile [file isfile $filename]
if {$isfile==0} then {
set filter 0
} else {
set size [file size $filename]
set hrfilesize [hrfilesize::bytestohr $size]
set hrsizelimit "$sizelimit $sizelimitunit"
set compare [hrfilesize::compare $hrfilesize $hrsizelimit]
switch -- $sizeoperator {
"min" {
set filter [expr {$compare>=0}]
}
"max" {
set filter [expr {$compare<=0}]
}
default {
error "Unknown size operator $sizeoperator"
}
}
}
return $filter
}
#
# log --
# Display the given message on the text widget
#
method log {msg} {
$wtext insert end "$msg\n"
$wtext see end
}
}An here is a simple client.
#
# largestfilesview-gui
# A sample testcase for the largestfilesview mega-widget.
#
lappend ::auto_path hrfilesize-1.1
lappend ::auto_path largestfilesview-1.0
package require largestfilesview
set dialog [largestfilesview create .mydialog]
pack $dialog
$dialog draw
See also: