5 File::Mkpath - create or remove a series of directories
11 C<mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);>
13 C<rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);>
17 The C<mkpath> function provides a convenient way to create directories, even if
18 your C<mkdir> kernel call won't create more than one level of directory at a
19 time. C<mkpath> takes three arguments:
25 the name of the path to create, or a reference
26 to a list of paths to create,
30 a boolean value, which if TRUE will cause C<mkpath>
31 to print the name of each directory as it is created
32 (defaults to FALSE), and
36 the numeric mode to use when creating the directories
41 It returns a list of all directories (including intermediates, determined using
42 the Unix '/' separator) created.
44 Similarly, the C<rmtree> function provides a convenient way to delete a
45 subtree from the directory structure, much like the Unix command C<rm -r>.
46 C<rmtree> takes three arguments:
52 the root of the subtree to delete, or a reference to
53 a list of roots. All of the files and directories
54 below each root, as well as the roots themselves,
55 will be deleted. For the moment, C<rmtree> expects
56 Unix file specification syntax.
60 a boolean value, which if TRUE will cause C<rmtree> to
61 print a message each time it tries to delete a file,
62 giving the name of the file, and indicating whether
63 it's using C<rmdir> or C<unlink> to remove it.
68 a boolean value, which if TRUE will cause C<rmtree> to
69 skip any files to which you do not have write access.
70 This will change in the future when a criterion for
71 'delete permission' is settled. (defaults to FALSE)
75 It returns the number of files successfully deleted.
79 Tim Bunce <Tim.Bunce@ig.co.uk>
80 Charles Bailey <bailey@genetics.upenn.edu>
84 This document was last revised 29-Jan-1995, for perl 5.001
92 @ISA = qw( Exporter );
93 @EXPORT = qw( mkpath rmtree );
96 my($paths, $verbose, $mode) = @_;
97 # $paths -- either a path string or ref to list of paths
98 # $verbose -- optional print "mkdir $path" for each directory created
99 # $mode -- optional permissions, defaults to 0777
101 $mode = 0777 unless defined($mode);
102 $paths = [$paths] unless ref $paths;
104 foreach $path (@$paths){
107 foreach(split(/\//, $path)){
110 print "mkdir @p\n" if $verbose;
111 mkdir("@p",$mode) || croak "mkdir @p: $!";
112 push(@created, "@p");
119 my($roots, $verbose, $safe) = @_;
121 $roots = [$roots] unless ref $roots;
123 foreach $root (@{$roots}) {
127 @files = map("$root/$_", grep $_!~/^\.{1,2}$/, readdir(D));
129 $count += rmtree(\@files,$verbose,$safe);
130 next if ($safe && !(-w $root));
131 print "rmdir $root\n" if $verbose;
132 (rmdir $root && ++$count) or carp "Can't remove directory $root: $!";
135 next if ($safe && !(-w $root));
136 print "unlink $root\n" if $verbose;
137 (unlink($root) && ++$count) or carp "Can't unlink file $root: $!";