Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

'Permission Denied' error from File::Find

by witandhumor (Pilgrim)
on Feb 11, 2004 at 03:28 UTC ( #328125=perlquestion: print w/ replies, xml ) Need Help??
witandhumor has asked for the wisdom of the Perl Monks concerning the following question:

I am very new to Perl and need your help.

#!c:\perl\bin\perl.exe -w use strict; use File::Find; use Carp; #variables my ($directory,$file,$text); print "Enter search text: "; $text = <STDIN>; chomp $text; $directory = 'c:\my_directory'; find (\&search,$directory); sub search { my $file = $File::Find::name; open (FILE, "$file") or carp "Guess what, it didn't work!\n$!"; my $line = <FILE>; close FILE; print "$text - $file" if $line =~ /$text/; }

I have numerous errors that I am trying to work my way through, but the one that I am trying to figure out right now is:
Permission denied at C:/Perl/lib/File/Find.pm line 450
(I am sure there are several other errors the monks can point out as well :-) )

Find.pm is in that folder and I have full access to it. I found this but I don't know enough to figure out if it is truly related or not. I am using PPM 3.0.1 if that helps....

Any help would be greatly appreciated.
Thanks so much!

2006-03-04 Retitled by planetscape, as per Monastery guidelines
Original title: 'Permission Denied'

Comment on 'Permission Denied' error from File::Find
Download Code
Re: 'Permission Denied' error from File::Find
by Roger (Parson) on Feb 11, 2004 at 03:36 UTC
    $directory = 'c:\my_directory';

    Should be:
    $directory = 'c:\\my_directory'; # or $directory = 'c:/my_directory';

    Update: This is not the problem it seems. So the problem should be elsewhere.

      Are you sure? It seemed to work for me:
      C:\>perl my $x = 'c:\my_dir'; print "'$x'\n"; ^Z 'c:\my_dir' C:\>perl -v This is perl, v5.8.0 built for MSWin32-x86-multi-thread

      jdporter
      The 6th Rule of Perl Club is -- There is no Rule #6.

      Roger, that should work fine because witandhumor is using apostrophes (single ticks). These are all the same thing on Win32:

      $directory = 'c:\my_directory'; $directory = 'c:/my_directory'; $directory = "c:\\my_directory"; $directory = "c:/my_directory";

      Basically, if you're going to need to expand any variables, you need to use quotes (double ticks), but for literals it's easier to use apostrophes.

Re: 'Permission Denied' error from File::Find
by jdporter (Canon) on Feb 11, 2004 at 03:47 UTC

    First and foremost, I think you should add the $file to the error message. Then, when you get an error, you can go and double-check the file manually to verify that you have 'read' access to it.

    Second, and just as important, you should return from the subroutine when there's an error. As it is, you carp... but then you execute the rest of the sub anyway.

    As written, you're only searching for matches in the first line of each file encountered. If that's not what you want, you might try simply undefining $/ locally in the sub.

    Here's how I'd probably modify your code:

    sub search { my $file = $File::Find::name; unless ( open FILE, "< $file" ) { carp "Error opening $file for reading - $!\n"; return; } local $/; # sluurp (if appropriate) my $line = <FILE>; close FILE; print "$text - $file" if $line =~ /$text/; }
    (But, TIMTOWTDI, as always...)

    jdporter
    The 6th Rule of Perl Club is -- There is no Rule #6.

Re: 'Permission Denied' error from File::Find
by NetWallah (Abbot) on Feb 11, 2004 at 06:22 UTC

    Permission denied at C:/Perl/lib/File/Find.pm line 450

    This is complaining that the "Find.pm" module had a problem at line 450. The issue is with WHAT you are trying to FIND - not with access to the Find.pm module.

    Line 450 in Version 1.04 of Find.pm is blank.

    The next runnable line reads:
    if ( (-e $fn) || (-l $fn) ) {
    Which may indicate that you have permission problems on the Directories/Files you are trying to find (Or there is a bug in the Find.pm module).

    Can you tell us what version of File::Find you are using?

    "When you are faced with a dilemma, might as well make dilemmanade. "

Re: 'Permission Denied' error from File::Find
by Daruma (Curate) on Feb 11, 2004 at 08:59 UTC
    Geetings, witandhumor!

    After running your code on my Win32 machine, I received the same (or a similar) error about permissions. A few well placed print statements and switches flipped later, I found that File::Find was finding the . file/directory first. The open is the part that seems to fail when it attempts to open the . file/directory.

    I did a few file tests (-r and -f) to find only readable plain files. This happily skips over the . and .. files/directories.

    Here's code that does not get the same file permission error:
    #!c:\perl\bin\perl.exe -w use strict; use File::Find; use Carp; #variables my ($directory,$file,$text); print "Enter search text: "; $text = <STDIN>; chomp $text; $directory = 'c:\my_directory'; find (\&search,$directory); sub search { my $file = $File::Find::name; if (-r $file && -f $file) { open (FILE, "$file") or carp "Guess what, it didn't work!\n$!"; my $line = <FILE>; close FILE; print "$text - $file" if $line =~ /$text/; } }
    Hope this helps!

    -Daruma
      All:
      With all of the help given to me here(and some one-on-one tutoring) I was able to work out most of my issues! Thank you very much!!!!!!!!!!!

      Here is my most recent attempt..getting there

      #!c:\perl\bin\perl.exe -w use strict; use File::Find; #variables my ($directory,$file,$text); print "Enter search text: "; $text = <STDIN>; chomp $text; $directory = 'c:\my_directory'; find (\&search,$directory); sub search { my $file = $File::Find::name; if (-r $file && -f $file) { open (FILE, "$file") or die "Guess what, it didn't work! $!\n"; while (my $line = <FILE>) { print "$text - $file\n" if $line =~ /$text/; } } close FILE; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://328125]
Approved by Roger
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (9)
As of 2014-09-19 20:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (145 votes), past polls