Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: File::Find question

by converter (Priest)
on Jun 07, 2003 at 19:12 UTC ( #263993=note: print w/replies, xml ) Need Help??


in reply to File::Find question

Consider using the preprocess and postprocess callback parameters to filter out and report files and directories you can't read. File::Find is recursive, so it's important to catch errors not only for the initial directory, but also for any files and directories beneath it.

Here's an example that shows how you might do this:

#!/usr/bin/perl use warnings; use strict; use File::Find; use File::Spec::Functions; my $directory = 'foodir'; my $size = 0; my @unreadables = (); my @errors = (); sub wanted { # test: handling of @errors #local $_ = $_; #if (/foo\.txt/) { # $_ = "nonexistentfile"; #} if (stat) { -f _ and $size += -s _; } else { push @errors, catfile($File::Find::dir, $_) . " !$!"; } } # filter unreadable directories # from the list of files # returned by readdir() before # processing the directory: # sub preprocess { my @readables; for (@_) { if (!-r) { push @unreadables, catfile($File::Find::dir, $_) . " !not +readable"; } else { push @readables, $_; } } return @readables; } # post-directory processing: # sub postprocess { unless (@unreadables or @errors) { return; } print "$_\n" for (@unreadables, @errors); @unreadables = @errors = (); } find( { wanted => \&wanted, preprocess => \&preprocess, postprocess => \&postprocess, }, $directory ); print "$directory size: $size\n";

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://263993]
help
Chatterbox?
[LanX]: ... test

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (7)
As of 2017-03-28 10:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Should Pluto Get Its Planethood Back?



    Results (328 votes). Check out past polls.