Introduction
This is a disk usage viewer, a tool that helps answer the question, "What is taking up all my disk space?" It displays a tree of folders (directories) starting from the specified folder, listing with each folder the size of all that it contains. Folders are listed in the order of decreasing size. The tree may be expanded to show layers below the topmost.
Background
The inspiration for this tool is the Unix disk usage tool du. The lack of a satisfying, equivalent, commonly-available tool for Windows prompted me to write this one.
Using the code
Using the tool is straightforward:
- Click Select, and choose the drive or folder to examine.
- Expand any folder in the displayed list to see the details of its contents.
- Use the Copy menu to save a text representation of the displayed tree, or to copy the path to the selected folder.
The generated text representation of the tree shown is:
11.9 G C:
+ 4.16 G Program Files
+ 2.65 G Documents and Settings
+ 2.51 G WINNT
+ 1.08 G Matt
+ 68.4 M My Music
+ 28.3 M dell
+ 19.8 M Recycled
+ 18.4 M My Downloads
+ 10.3 M VXIPNP
+ 1.12 M samples
| + 1.12 M VC98
| + 1.12 M mfc
| + 846 K ole
| | + 846 K wordpad
| | + 27 K res
| | + 0 K UniDebug
| + 275 K general
| + 275 K LISTHDR
| + 33 K res
| + 0 K Release
+ 1 K cygwin
+ 0 K WUTemp
The code recursively explores the folder structure below the selected root folder, and populates a Windows tree control accordingly. The application is a single document (SDI) MFC app generated by AppWizard, with a CTreeView
used for the view class.
Most of the functionality is implemented in the CDiskUseView
class, which has close access to its underlying tree control. Event handlers for the menu operations appear in the CMainFrame
class.
Points of interest
A tree, such as a drive's folder structure, is inherently a recursive structure, so working with a tree is a natural application for recursive programming techniques. The function ScanDirectory
sums the sizes of the files in a directory, and calls itself recursively to find the sizes of directories it contains. The function DisplaySubtree
writes a text representation of one folder in the tree, and calls itself recursively for the levels below. And the function ExpandTreeLevel
calls itself recursively to adjust the tree control view so that one, two, or all levels are visible.
For a problem such as this one, using recursion realizes the desired functionality with a very small amount of code. The recursive approach may initially seem confounding and confusing, but it's not difficult. This small program can serve as an example of how it is done.
Acknowledgment
Thanks to S. Sokolenko, whose GetFolder
wrapper for SHBrowseForFolder
saved me the effort of learning the details of that operation.
History
- Oct. 3, 2006: Update to handle directory names that include a dot.
- Sept. 26, 2006: Created.