in reply to permission error

could you please tell me why I am getting the error below?
readdir returns a list of all directory entries (files, sub-directories, links, etc.), including the current directory, which has the special name '.', and the parent directory, which has the special name '..'.

The 1st open in your while loop tries to open the directory named '.'.

I believe you only want to open files. To do so, use the -f filetest like this:

use strict; use warnings; my $dir = "C:/move/output/test/"; opendir DIR, $dir or die "Unable to open $dir: $!"; while (my $filename=readdir DIR) { my $file = "$dir/$filename"; next unless -f $file; open my $fh, '<', $file or die "Unable to open $file: $!";
Note that I had to prepend the directory name to the filename.

Replies are listed 'Best First'.
Re^2: permission error
by zzgulu (Novice) on Mar 01, 2010 at 21:26 UTC
    Thank you toolic for your great help although I need to read more about "unless". I am not sure I understand it totally. I tested the script and for some reason it only reads the first text files in the directory (they are all text files). How I can generate a text files in the output for every text files that it reads in?
    #!/usr/bin/perl use strict; use warnings; my $dir="C:/move/output/test"; opendir DIR, $dir or die "Unable to open $dir: $!"; while (my $filename=readdir DIR) { my $file="$dir/$filename"; next unless -f $file; open my $fh, '<', $file or die "Unable to open $filename: $!"; open OUT,">C:/move/output/test/out.txt"; select OUT; my (variables); { my loop} close $fh; }

      The code you posted will open every file that exists and passes the -f (entry is plain file) file test.

      Unfortunately, it will also open the same output file on each pass of the while loop -- with write permission (not append). Ie, every pass through the loop creates a completely new c:/move/output/test/out.txt file. I suspect this is the reason you believe you are only finding a single file.

      To append to the file on each pass, change your open command from open OUT,">C:/move/output/test/out.txt"; to open OUT,">>C:/move/output/test/out.txt"; You should also consider checking the return value of open.

        Thank You!