Reading Directory Content

Reading the content of a directory is not much different from reading a file. It also requires a file handle (or, directory handle, in this case) and uses its specialized open and close functions, opendir() and closedir( ), respectively. To actually read the directory, readdir(DIRECTORY_HANDLE) must be called. If readdir( ) is called in a scalar context, it returns one directory entry every time it is called. If it is called in a list context, it will return a a list of all entries.


$entry   = readdir(DIRECTORY_HANDLE); # scalar context
@entries = readdir(DIRECTORY_HANDLE); # list context

readDirectory1.pl

#!/usr/bin/perl

# program opens a directory, reads it, and prints
# the content to STDOUT

# first, create a variable that holds the path to the directory

$dir = "./test"; # we assume directory is a subdirectory 
                 # of the current working directory

# second, create a directory handle named 'DIR':
# directory handles are created with the opendir() function;
# the first parameter is the name of the handle,
# the second is the path and name of the directory

# the directory hande is evaluated in a lsit context and passes
# all diretory entries into the array @contents

# print files in directory
opendir(DIR, $dir) || die ("Fatal error: $!");

@contents= readdir(DIR);

closedir(DIR);

print "\nFiles in directory \'$dir\':\n";

foreach $entry (@contents)
{
  # check if entry is a directory with the 
  # '-d' file test;
  # the directory handle only returns the items in the
  # directory; if the entry is to be tested, the path from
  # the current working directory of the script needs to 
  # be prepended
  
  next if (-d "$dir/$entry"); 
  print $entry . "\n";
}


The second script uses a file test to filter the directory content and only print text files.

readDirectory2.pl

#!/usr/bin/perl

# program opens a directory, reads it, and prints
# the content to STDOUT

# first, create a variable that holds the path to the directory

$dir = "./test"; # we assume directory is a subdirectory 
                 # of the current working directory

# second, create a directory handle named 'DIR':
# directory handles are created with the opendir() function;
# the first parameter is the name of the handle,
# the second is the path and name of the directory

# the directory handle is here evaluated in a scalar context
# and readdir() returns on directory entry at a time


print "\nSubdirectories in directory \'$dir\':\n";

# print subdirectories
opendir(DIR, $dir) || die ("Fatal error: $!");
while ($entry = readdir(DIR))
{
  # check if entry is a file with the 
  # '-f' file test;
  # the directory handle only returns the items in the
  # directory; if the entry is to be tested, the path from
  # the current working directory of the script needs to 
  # be prepended
  
  next if (-f "$dir/$entry");
  print $entry . "\n";;
}