While this isn't a perl solution, what about using something that (seems) to be designed for this task, namely a windows port of the linux program du and just using perl to parse it's output, perhaps combined with --max-depth= or something like that.