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: