Using a CPAN module is the recommended way to go, as indicated by the responses above.
It's also possible to solve this problem by going directly to the Win32 API, for example:
use Win32::API;
sub make_large_int {
my ($lo, $hi) = @_;
return $hi * (1 + 0xffffffff) + $lo;
}
# Return a two-element list: (size, free) in bytes.
sub win_get_disk_free {
my $dir = shift; # $dir is a directory on the disk of interest
$dir =~ tr{/}{\\};
my $GetDiskFreeSpaceEx = Win32::API->new(
'kernel32.dll',
'GetDiskFreeSpaceEx',
['P','P','P','P'], 'I')
or die;
my $lpFreeBytesAvailable = pack('L2', 0, 0);
my $lpTotalNumberOfBytes = pack('L2', 0, 0);
my $lpTotalNumberOfFreeBytes = pack('L2', 0, 0);
$GetDiskFreeSpaceEx->Call($dir,
$lpFreeBytesAvailable,
$lpTotalNumberOfBytes,
$lpTotalNumberOfFreeBytes)
or die "GetDiskFreeSpaceEx failed ($^E)\n";
return ( make_large_int(unpack('L2', $lpTotalNumberOfBytes)),
make_large_int(unpack('L2', $lpTotalNumberOfFreeBytes)) );
}
my ($size, $free) = win_get_disk_free('C:/');
printf "disk size = %d MB\n", $size/(1024*1024);
printf "disk free = %d MB\n", $free/(1024*1024);