Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re: Directory available?

by ph0enix (Friar)
on Oct 20, 2009 at 07:53 UTC ( #802156=note: print w/replies, xml ) Need Help??

in reply to Directory available?

You can try following code (untested)

my $separator = ($^O eq 'MSWin') ? '\' : '/'; sub readFiles { my $ipath = shift; my @files; opendir(sDir, $ipath) || die "Unable to open directory '$ipath': $!"; for (readdir(sDir)) { if (!/^\.{1,2}$/ && -d $iPath . $separator . $_) { # recursive call for directory readFiles($iPath . $separator . $_); } else { # collect matching files push @files, $_ if /\.mat$/; } } closedir(sDir); for (@files){ print FILE $ipath, $separator, $_, "\n"; } }

Replies are listed 'Best First'.
Re^2: Directory available?
by kingjamesid (Acolyte) on Oct 24, 2009 at 23:56 UTC
Re^2: Directory available?
by afoken (Chancellor) on Oct 25, 2009 at 08:52 UTC

    Notes and Problems:

    • Windows (and DOS and OS/2) accepts a forward slash as path separator, there is no need for $separator. If you want true multi-platform code, use File::Spec, which also handles classic MacOS and more exotic platforms.
    • $^O is never MSWin. It may be MSWin32 or perhaps MSWin64.
    • readFiles() is a bad name, as this function does not read files. It reads directories and print file names found there matching a hardcoded regular expression.
    • The function should really return a list of file names instead of printing them.
    • Recursion is not needed here, you could use a simple worklist (array) instead, containing directories to be processed.
    • Because you use a global directory handle (sDir) instead of a local handle (my $dir) or at least a localized handle (local *sDir), every recursion will automatically close and re-open the handle. Your code only works by accident, because you used for (readdir(sDir)) instead of while (defined($_=readdir(sDir))), reading the entire directory list into memory before iterating over it. Still, each and every call to closedir except for the first one will fail with "Bad file descriptor".
    • There is no need to reinvent directory tree walkers, there are several on CPAN that do not pollute namespaces, that properly check for errors, that work cross-platform, and that do not slurp everything into memory. And, of course, they have parameters allowing to customize the search.


    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (2)
As of 2023-06-08 05:35 GMT
Find Nodes?
    Voting Booth?
    How often do you go to conferences?

    Results (29 votes). Check out past polls.