xref: /openbsd-src/gnu/usr.bin/perl/lib/DirHandle.pm (revision d13be5d47e4149db2549a9828e244d59dbc43f15)
1package DirHandle;
2
3our $VERSION = '1.03';
4
5=head1 NAME
6
7DirHandle - supply object methods for directory handles
8
9=head1 SYNOPSIS
10
11    use DirHandle;
12    $d = DirHandle->new(".");
13    if (defined $d) {
14        while (defined($_ = $d->read)) { something($_); }
15        $d->rewind;
16        while (defined($_ = $d->read)) { something_else($_); }
17        undef $d;
18    }
19
20=head1 DESCRIPTION
21
22The C<DirHandle> method provide an alternative interface to the
23opendir(), closedir(), readdir(), and rewinddir() functions.
24
25The only objective benefit to using C<DirHandle> is that it avoids
26namespace pollution by creating globs to hold directory handles.
27
28=head1 NOTES
29
30=over 4
31
32=item *
33
34On Mac OS (Classic), the path separator is ':', not '/', and the
35current directory is denoted as ':', not '.'. You should be careful
36about specifying relative pathnames. While a full path always begins
37with a volume name, a relative pathname should always begin with a
38':'.  If specifying a volume name only, a trailing ':' is required.
39
40=back
41
42=cut
43
44require 5.000;
45use Carp;
46use Symbol;
47
48sub new {
49    @_ >= 1 && @_ <= 2 or croak 'usage: DirHandle->new( [DIRNAME] )';
50    my $class = shift;
51    my $dh = gensym;
52    if (@_) {
53	DirHandle::open($dh, $_[0])
54	    or return undef;
55    }
56    bless $dh, $class;
57}
58
59sub DESTROY {
60    my ($dh) = @_;
61    # Don't warn about already being closed as it may have been closed
62    # correctly, or maybe never opened at all.
63    local($., $@, $!, $^E, $?);
64    no warnings 'io';
65    closedir($dh);
66}
67
68sub open {
69    @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
70    my ($dh, $dirname) = @_;
71    opendir($dh, $dirname);
72}
73
74sub close {
75    @_ == 1 or croak 'usage: $dh->close()';
76    my ($dh) = @_;
77    closedir($dh);
78}
79
80sub read {
81    @_ == 1 or croak 'usage: $dh->read()';
82    my ($dh) = @_;
83    readdir($dh);
84}
85
86sub rewind {
87    @_ == 1 or croak 'usage: $dh->rewind()';
88    my ($dh) = @_;
89    rewinddir($dh);
90}
91
921;
93