1package DirHandle; 2 3our $VERSION = '1.01'; 4 5=head1 NAME 6 7DirHandle - supply object methods for directory handles 8 9=head1 SYNOPSIS 10 11 use DirHandle; 12 $d = new DirHandle "."; 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: new DirHandle [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 no warnings 'io'; 64 closedir($dh); 65} 66 67sub open { 68 @_ == 2 or croak 'usage: $dh->open(DIRNAME)'; 69 my ($dh, $dirname) = @_; 70 opendir($dh, $dirname); 71} 72 73sub close { 74 @_ == 1 or croak 'usage: $dh->close()'; 75 my ($dh) = @_; 76 closedir($dh); 77} 78 79sub read { 80 @_ == 1 or croak 'usage: $dh->read()'; 81 my ($dh) = @_; 82 readdir($dh); 83} 84 85sub rewind { 86 @_ == 1 or croak 'usage: $dh->rewind()'; 87 my ($dh) = @_; 88 rewinddir($dh); 89} 90 911; 92