2.6. Querying Filesystem UsageGiven the methods of controlling filesystem usage we've just explored, it is only natural to want to keep track of how well they work. To end this chapter, let's look at a method for querying the filesystem usage on each of the operating systems found in this book. MacOS is the operating system for which this task is hardest. MacOS does have a Macintosh Toolbox routine (PBHGetVInfo) to retrieve volume information, but at the current time there is no MacPerl module available to make calling this function easy. Instead, we have to take a roundabout approach and ask the Finder to query this information for us. This is easy in practice thanks to a glue module, but the setup needed for this method makes MacOS the more difficult operating system to deal with. All the materials for the following involve work by Chris Nandor and can be found at http://pudge.net or on CPAN. Bear with me as we go over this setup step by step:
This complex setup process allows us to write the following simple-looking code: use Mac::Glue qw(:all); $fobj = new Mac::Glue 'Finder'; $volumename = "Macintosh HD"; # the name of one of our mounted disks $total = $fobj->get($fobj->prop('capacity', disk => $volumename), as => 'doub'); $free = $fobj->get($fobj->prop('free_space', disk => $volumename), as => 'doub'); print "$free bytes of $total bytes free\n"; Let's move to easier territory. If we wanted to query the same information from a Win32 machine, we could use Dave Roth's Win32::AdminMisc module: use Win32::AdminMisc; ($total,$free) = Win32::AdminMisc::GetDriveSpace("c:\\"); print "$free bytes of $total bytes free\n"; Finally, let's end this chapter by looking at the Unix equivalent. There are several Unix modules available, including Filesys::DiskSpace by Fabien Tassin, Filesys::Df by Ian Guthrie, and Filesys::DiskFree by Alan R. Barclay. The first two of these make use of the Unix system call statvfs( ) while the last one actually parses the output of the Unix command df on all of the systems it supports. Choosing between these modules is mostly a matter of personal preference and operating system support. I prefer Filesys::Df because it offers a rich feature set and does not spawn another process (a potential security risk, as discussed in Chapter 1, "Introduction") as part of a query. Here's one way to write code equivalent to the previous two examples: use Filesys::Df; $fobj = df("/"); print $fobj->{su_bavail}*1024." bytes of ". $fobj->{su_blocks}*1024." bytes free\n"; We have to do a little bit of arithmetic (i.e., *1024) because Filesys::Df returns values in terms of blocks, and each block is 1024 bytes on our system. The df( ) function for this module can be passed a second optional argument for block size if necessary. Also worth noting about this code are the two hash values we've requested. su_bavail and su_blocks are the values returned by this module for the "real" size and disk usage information. On most Unix filesystems, the df command would show a value that hides the standard 10% of a disk set aside for superuser overflow. If we wanted to see the total amount of space available and the current amount free from a normal user's perspective, we would have used user_blocks and user_bavail instead. With the key pieces of Perl code we've just seen, it is possible to build more sophisticated disk monitoring and management systems. These filesystem watchdogs will help you deal with space problems before they occur. Copyright © 2001 O'Reilly & Associates. All rights reserved. |
|