Clean Up your HDD (GUI)

Last Update: 09.12.2006. By kerim in gui | hddcleaner | python

I finished a small prototype with an “acceptable” GUI.
The functionality for going through the disk(s) and sorting all files according to size was already nearly finished last time.

So i more or less only had to add a way to represent the results in a GUI.

Its not perfect and i have some ideas to make it better and more functional, but it works the way it is and honestly i don’t think there is soooo much to do.

Note: The code needs some cleanup. If you want a copy, mail me or leave a comment.

class Display(wx.Frame):  
     def _ _init_ _(self,files):  
         wx.Frame.__init__(self,None,-1,"HDD Clean",size=wx.DefaultSize)  
         self.sizer = wx.BoxSizer(wx.VERTICAL)  
         self.btn=wx.Button(self, ID_DELETE, "Delete", pos=wx.Point(20, 0))  
         wx.EVT_BUTTON(self, ID_DELETE, self.OnDelete)  
         sampleList=[]  
         self.files=[]  
         for i in files:  
              sampleList.append(str(i[0])+" ("+str(i[1])+")")  
              self.files.append(str(i[0]))  
         self.listBox= wx.CheckListBox(self, -1, pos=(20,30), size=wx.DefaultSize, style=wx.LB_HSCROLL,validator=wx.DefaultValidator, name="listBox",choices= sampleList)  
         self.sizer.Add(self.btn,flag=wx.GROW, proportion=0)  
         self.sizer.Add(self.listBox,flag=wx.GROW, proportion=1)  
         self.SetSizer(self.sizer)  
         self.Show(1)

What did I do.... I used a Frame with one button, one checkboxlist and a Sizer (which means a Panel that can resize its children if the Frame is resized).
Buttonevents are bound to a method “OnDelete”.
To create the GUI i go through all files (already sorted accoring to size) and create a checkboxitem for the list containin size and path of the file.
What i needed in the end was an implementation of the OnDelete method. I am not yet satisfied with it. I am sure (remember i am still just learning python) that there is a simpler way to have a loop running from a HIGH number to a LOW one than the way i used here:

 def OnDelete(self, event):  
         #this is ugly. is there no way to have a loop starting from top ?  
         end = self.listBox.GetCount()-1   
         for index in range(self.listBox.GetCount()):  
              if self.listBox.IsChecked(end-index):  
                  os.remove(self.files[end-index])  
                  self.listBox.Delete(end-index)  
                  self.files.remove(self.files[end-index])

I will post the complete code once i got the time to clean it up enough to not embarass me more than those snipplets already do ;-)

Here a picture:

Bugs:
Directories are not shown and can’t be deleted. All you can delete are files. So if you delete all files in a directory it will still continue to exist.
Changes for the future:
-Performance depends to a high degree on the number of files to sort. I bet that not everyone will need a complete list of all files (or all types) so it might be better to allow for command line options filtering certain types or limiting the resultset.
-Performance depends even more on the GUI ! It might be sufficient to have a list without the GUI, so i would make it optional too.
-GUI is not really satisfactory yet. Might be better to show the relations of the sizes in a different way, using colors, treeviews etc.

Performance
I tested the program on my thinkpad T41 (Pentium M 1.7 GHz, 1 GB RAM, 40 GB HDD, 2 partitions)
First i used the properties dialog in the windows explorer to test the performance of windows itself, then i started my program.

Windows:
For drive c windows takes 1:40 mintutes to determine the amount of files/dir/hdd-usage. (75190 files, 17.9GB used, 1.58 GB free)
For drive d (53342 files, 22.7 GB used, 3.87 GB free) it takes 2:06 minutes

Python:
c: 2:07
d: 2:18
Not bad if you consider that the gui must be generated.