Case Study: Finding the Directory Size

Paul Ngugi - Jul 2 - - Dev Community

Recursive methods are efficient for solving problems with recursive structures. The preceding examples can easily be solved without using recursion. This section presents a problem that is difficult to solve without using recursion. The problem is to find the size of a directory. The size of a directory is the sum of the sizes of all files in the directory. A directory d may contain subdirectories. Suppose a directory contains files f1, f2, ... , fm and subdirectories d1, d2, ... , dn, as shown in Figure below.

Image description

The size of the directory can be defined recursively as follows:

size(d) = size(f1) + size(f2) + ... + size(fm) + size(d1) + size(d2) + ... + size(dn)

The File class can be used to represent a file or a directory and obtain the properties for files and directories. Two methods in the File class are useful for this problem:

  • The length() method returns the size of a file.
  • The listFiles() method returns an array of File objects under a directory.

The code below gives a program that prompts the user to enter a directory or a file and displays its size.

Image description

If the file object represents a directory (line 20), each subitem (file or subdirectory) in the directory is recursively invoked to obtain its size (line 23). If the file object represents a file (line 26), the file size is obtained and added to the total size (line 27).

What happens if an incorrect or a nonexistent directory is entered? The program will detect that it is not a directory and invoke file.length() (line 27), which returns 0. Thus, in this case, the getSize method will return 0.

To avoid mistakes, it is a good practice to test all cases. For example, you should test the program for an input of file, an empty directory, a nonexistent directory, and a nonexistent file.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .