NAME
Badger::Filesystem::Directory - directory object
SYNOPSIS
# using either of Badger::Filesytem constructor subroutines
use Badger::Filesystem 'Dir Directory';
# use native OS-specific paths:
$dir = Dir('/path/to/dir');
# or generic OS-independent paths
$dir = Dir('path', 'to', 'dir');
# Dir is short for Directory if you prefer longness
$dir = Directory('/path/to/dir');
$dir = Directory('path', 'to', 'dir');
# manual object construction
use Badger::Filesystem::Directory;
# positional arguments
$dir = Badger::Filesystem::Directory->new('/path/to/file');
$dir = Badger::Filesystem::Directory->new(['path', 'to', 'file']);
# named parameters
$dir = Badger::Filesystem::Directory->new(
path => '/path/to/dir' # native
);
$dir = Badger::Filesystem::Directory->new(
path => ['path', 'to', 'dir'] # portable
);
# path inspection methods
$dir->path; # full path
$dir->directory; # same as path()
$dir->dir; # alias to directory()
$dir->base; # same as path()
$dir->volume; # path volume (e.g. C:)
$dir->is_absolute; # path is absolute
$dir->is_relative; # path is relative
$dir->exists; # returns true/false
$dir->must_exist; # throws error if not
@stats = $dir->stat; # returns list
$stats = $dir->stat; # returns list ref
# path translation methods
$dir->relative; # relative to cwd
$dir->relative($base); # relative to $base
$dir->absolute; # relative to filesystem root
$dir->definitive; # physical file location
$dir->collapse; # resolve '.' and '..' in $file path
# path comparison methods
$dir->above($another_path); # $dir is ancestor of $another_path
$dir->below($another_path); # $dir is descendant of $another_path
# directory manipulation methods
$dir->create; # create directory
$dir->delete; # delete directory
$fh = $dir->open; # open directory to read
# all-in-one read/write methods
@data = $dir->read; # return directory index
@kids = $dir->children; # objects for each file/subdir
@files = $dir->files; # objects for each file in dir
@dirs = $dir->dirs; # objects for each sub-dir in dir
@dirs = $dir->directories; # same as dirs()
DESCRIPTION
The Badger::Filesystem::Directory
module is a subclass of Badger::Filesystem::Path for representing directories in a file system.
You can create a file object using the Dir
constructor function in Badger::Filesystem. This is also available as Directory
if you prefer longer names.
use Badger::Filesystem 'Dir';
Directory paths can be specified as a single string using your native filesystem format or as a list or reference to a list of items in the path for platform-independent paths.
my $dir = Dir('/path/to/dir');
If you're concerned about portability to other operating systems and/or file systems, then you can specify the directory path as a list or reference to a list of component names.
my $dir = Dir('path', 'to', 'dir');
my $dir = Dir(['path', 'to', 'dir']);
METHODS
In addition to the methods inherited from Badger::Filesystem::Path, the following methods are defined or re-defined.
init(\%config)
Customised initialisation method specific to directories.
exists
Returns true if the directory exists in the filesystem. Returns false if the directory does not exists or if it is not a directory (e.g. a file).
is_directory() / is_dir()
This method returns true for all Badger::Filesystem::Directory
instances.
volume() / vol()
Returns any volume defined as part of the path. This is most commonly used on Win32 platforms to indicate drive letters, e.g. C:
.
# on MS Windows
print Dir('C:\\foo\\bar')->volume; # C
base()
This always returns $self
for directories.
canonical()
This returns the canonoical representation of the directory path. This is the absolute path with a trailing slash added (or whatever the relevant directory separator is for your filesystem).
print Dir('/foo/bar')->canonical; # /foo/bar/
directory() / dir()
Returns the complete directory path when called without arguments. This is effectively the same thing as path()
or base()
returns, given that this object is a directory.
This can also be used with an argument to locate another directory relative to this one.
my $dir = Dir('/path/to/dir');
print $dir->dir; # /path/to/dir (auto-stringified)
print $dir->dir('subdir'); # /path/to/dir/subdir (ditto)
Directories are returned as new Badger::Filesystem::Directory
objects. The above examples are relying on the auto-stringification to display the path when printed.
file($name)
This method can be used to locate a file relative to the directory. The file is returned as a Badger::Filesystem::File object.
my $dir = Dir('/path/to/dir');
my $file = $dir->file('example.txt');
print $file->path; # /path/to/dir/example.txt
print $file; # same (auto-stringified)
create()
This method can be used to create the directory if it doesn't already exist.
Dir('/path/to/dir')->create;
delete()
This method deletes the directory permanently. Use it wisely.
Dir('/tmp/junk')->delete;
mkdir($subdir)
This method can be used to create a sub-directory.
my $dir = Dir('/tmp');
$dir->mkdir('junk'); # /tmp/junk
When called without an argument it has the same effect as create() in creating itself.
my $dir = Dir('/tmp/junk');
$dir->mkdir; # same as $dir->create
rmdir($subdir);
This does the opposite of mkdir() but works in the same way. It can be used to delete a sub-directory:
my $dir = Dir('/tmp');
$dir->rmdir('junk'); # /tmp/junk
Or the directory itself when called without an argument:
my $dir = Dir('/tmp/junk');
$dir->rmdir; # same as $dir->delete
open()
This method opens the directory and returns an IO::Dir handle to it.
$fh = $dir->open;
while (defined($item = $fh->read)) {
print $item, "\n";
}
read($all)
This method read the contents of the directory. It returns a list (in list context) or a reference to a list (in scalar context) containing the names of the entries in the directory.
my @entries = $dir->read; # list in list context
my $entries = $dir->read; # list ref in scalar context
By default, the .
and ..
directories (or the equivalents for your file system) are ignored. Pass a true value for the $all
flag if you want them included.
children($all)
Returns the entries of a directory as Badger::Filesystem::File or Badger::Filesystem::Directory objects. Returns a list (in list context) or a reference to a list (in scalar context).
my @kids = $dir->children; # list in list context
my $kids = $dir->children; # list ref in scalar context
files()
Returns a list (in list context) or a reference to a list (in scalar context) of all the files in a directory as Badger::Filesystem::File objects.
my @files = $dir->files; # list in list context
my $files = $dir->files; # list ref in scalar context
directories() / dirs()
Returns a list (in list context) or a reference to a list (in scalar context) of all the sub-directories in a directory as Badger::Filesystem::Directory objects.
my @dirs = $dir->dirs; # list in list context
my $dirs = $dir->dirs; # list ref in scalar context
visit($visitor)
Entry point for a filesystem visitor for visit a directory. A reference to a Badger::Filesystem::Visitor object (or subclass) should be passed as the first argument.
use Badger::Filesystem::Visitor;
my $visitor = Badger::Filesystem::Visitor->new( in_dirs => 1 );
$dir->visit($visitor);
Alternately, a list or reference to a hash array of named parameters may be provided. These will be used to instantiate a new Badger::Filesystem::Visitor object (via the Badger::Filesystem visitor() method) which will then be applied to the directory. If no arguments are passed then a visitor is created with a default configuration.
# either list of named params
$dir->visit( in_dirs => 1 );
# or reference to hash array
$dir->visit({ in_dirs => 1});
The method then calls the visitor visit() passing $self
as an argument to begin visiting the directory.
accept($visitor)
This method is called to dispatch a visitor to the correct method for a filesystem object. In the Badger::Filesystem::Directory class, it calls the visitor visit_directory() method, passing the $self
object reference as an argument.
enter($visitor)
This is a custom variant of the accept() method which is called by a visitor when it first enters a filesystem. Instead of calling the visitor visit_directory() method, it calls visit_directory_children() passing $self
as an argument to begin visiting the files and sub-directories contained in this directory.
AUTHOR
Andy Wardley <abw@wardley.org>
COPYRIGHT
Copyright (C) 2005-2008 Andy Wardley. All rights reserved.
ACKNOWLEDGEMENTS
The Badger::Filesystem
modules are built around a number of existing Perl modules, including File::Spec, File::Path, Cwd, IO::File, IO::Dir and draw heavily on ideas in Path::Class.
Please see the ACKNOWLEDGEMENTS in Badger::Filesystem for further information.
SEE ALSO
Badger::Filesystem, Badger::Filesystem::Path, Badger::Filesystem::File, Badger::Filesystem::Visitor.