Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

OLE dir size and number of files and folders

by blackadder (Hermit)
on Oct 03, 2003 at 21:10 UTC ( #296394=perlquestion: print w/replies, xml ) Need Help??

blackadder has asked for the wisdom of the Perl Monks concerning the following question:

I have this code below, which obtains the size of a directory and the number of files and folders (I normally use it on dirs on remote machines). It works fine but it takes twice as long as doing the same thing manually. I suspect this is due to obtaining the size (thatís one), and then obtaining the number of files and folders (thatís two), which makes the script execute two operations thus taking twice as long. My question is; Is there a way that I can combine the two operations in one, so that the script can take just as long as doing the same manually Or a bit faster?

use strict; use Win32::OLE qw[in with]; my $fs = Win32::OLE->CreateObject('Scripting.FileSystemObject'); my $fCount =0; my $sCount =0; my $size = 0; my $d = $fs->GetFolder("$ARGV[0]"); my @folders = $fs->GetFolder("$ARGV[0]" ); eval { $size = $d->size( ); while( @folders ) { my $folder = pop @folders; $fCount += $folder->Files->Count; $sCount += $folder->SubFolders->Count; for my $subFolder ( in $folder->SubFolders ) { $fCount += $subFolder->Files->Count; push @folders, $_ for in $subFolder->SubFolders ; $sCount += $subFolder->SubFolders->Count; } } my $size_gb = ($size/1024/1024); print "Size: ".$size_gb."Mb ($size byte), Files: $fCount, folders: + $sCount"; };

Replies are listed 'Best First'.
Re: OLE dir size and number of files and folders
by particle (Vicar) on Oct 04, 2003 at 02:53 UTC

    drop ole and use File::Find::Rule (a fine module, and platform independent!)

    #!/usr/bin/perl use strict; use warnings; use File::Find::Rule (); die 'usage: *directory*' unless 1 == @ARGV; my( $size, $files, $folders ); my $rule= File::Find::Rule->start( @ARGV ); while( my $item= $rule->match ) { next if $ARGV[0] eq $item; $size+= -s $item; -f $item and $files++; -d $item and $folders++; } printf "Size: %fMb (%d byte), Files: %d, folders: %d\n" => $size / 1024**2, $size, $files, $folders;

    ~Particle *accelerates*

      The code works fine on local dirs, however when assigning a remote folder to ARGV, I get the following error;
      C:\Scripts> //srvA/g$/Eng_Support/Data_Removal Use of uninitialized value in printf at C:\Scripts\ +line 20. Size: 1.414590Mb (1483305 byte), Files: 3, folders:
      And the value of the folders is incorrect (always zero). I would appreciate it if you could guide me to fixing this problem now I am close to solving my issues.

      Thanks for this Mr Particle.


Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://296394]
Approved by Enlil
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (9)
As of 2022-05-16 14:34 GMT
Find Nodes?
    Voting Booth?
    Do you prefer to work remotely?

    Results (63 votes). Check out past polls.