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

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??
This is a fairly straightforward tutorial of how to open a directory, read the contents from that directory, and change directories.

There are 7 basic functions that can be utilized to navigate through directories: opendir, readdir, closedir, rewinddir, telldir, seekdir, chdir. I'll give you an example of how to use each of these to help get you started.

opendir, readdir, & closedir

Let's start with the following code:
1 : use Cwd; 2 : 3 : my $dir = getcwd; 4 : 5 : opendir (DIR, $dir) or die $!; 6 : my @dir = readdir DIR; 7 : 8 : foreach my $item (@dir) { 9 : print "$item\n"; 10: } 11: 12: closedir DIR;
This bit of code simply opens the current working directory (CWD) and then displays the contents of it on the screen (much like the 'dir' command in DOS or 'ls' on UNIX). Let's look at the code a piece at a time.

LINE 1:
This line simply gives us access to the getcwd command that will retrieve the current working directory.

LINE 3:
This line stores the CWD into the scalar $dir.

LINE 5:
Open the directory using opendir. The function opendir will return true if it was successful, otherwise, it will return false. If the directory can't be opened (i.e. the directory doesn't exist), the opendir function will return false and the script will terminate.

LINE 6:
Use the readdir function to store the contents of the file into @dir.

LINES 8-10:
Print each directory element onto the screen, one per line.

LINE 12:
Finally, close the file using the closedir function.


rewinddir

Now that we've seen how to use opendir, readdir, and closedir, we can look at a couple of the other functions for dealing with directories. First, let's look at rewinddir.

This bit of code will fill two arrays, @dir and @perlFiles. The array @dir will be filled with all of the contents of the directory and we'll use grep to filter the contents of the directory and put only Perl files (.pl files) into the array @perlFiles. Finally, we'll print just Perl files (as if we typed "dir *.pl" in DOS).
1 : use Cwd; 2 : 3 : my $dir = getcwd; 4 : 5 : opendir (DIR, $dir) or die $!; 6 : my @dir = readdir DIR; 7 : my @perlFiles = grep /\.pl/, readdir DIR; 8 : 9 : foreach my $item (@perlFiles) { 10: print "$item\n"; 11: } 12: 13: closedir DIR;
From this bit of code, you won't get any output. The reason is that when using the readdir function, the seekpointer (the file/directory currently being pointed to) has moved all the way to the end of the directory. If it hadn't, we wouldn't have all of the contents of our directory in @dir. Unfortnately, this leaves @perlFiles empty. To fix this, we need to reset the seekpointer to the beginning of the directory by using rewinddir. Add this line between lines 6 and 7:
rewinddir(DIR);
Now, you should get the output of just the Perl files within your directory.


telldir & seekdir

You can also set the seekpointer to any position within the directory (rather than just the beginning) by using telldir and seekdir. The telldir function returns the current seekpointer and the seekdir function will set the seekpointer to a value returned by the telldir function. If this sounds confusing, try this script:
1 : use Cwd; 2 : 3 : my $dir = getcwd; 4 : my $dirPointer; 5 : 6 : opendir (DIR, $dir) or die $!; 7 : $dirPointer = telldir (DIR); 8 : 9 : my @dir = readdir DIR; 10: 11: seekdir (DIR, $dirPointer); 12: 13: my @perlFiles = grep /\.pl/, readdir DIR; 14: 15: foreach my $item (@perlFiles) { 16: print "$item\n"; 17: } 18: 19: closedir DIR;
In this script, I'm storing the original seekpointer (that being at the beginning of the directory), using telldir, and then later using seekdir to move the seekpointer to that point. In this case, we've recreated rewinddir. If you execute this script, you should get the exact same output that we got for the previous one.


chdir

The final function for dealing with directories is chdir. This one is pretty simple, pass it an expression and chdir will change the current working directory to that (if possible).
1: use Cwd; 2: 3: print getcwd,"\n"; 4: chdir("C:\\"); 5: print getcwd;
This little script will display the CWD and then try to change that CWD to "C:\". You might want to do a check in case it can't find that directory, but this was just a quick example.



With that, you should be able to navigate through directories pretty easily. For more information, you can take a look at The Perl Documentation.

Good luck!

- Sherlock

In reply to Navigating and Reading Directories by Sherlock

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • Outside of code tags, you may need to use entities for some characters:
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others cooling their heels in the Monastery: (5)
    As of 2014-08-21 05:28 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      The best computer themed movie is:











      Results (127 votes), past polls