perl5.000 patch.0m: [various fixes, hint file updates and documentation]
[p5sagit/p5-mst-13.2.git] / lib / File / Path.pm
CommitLineData
fed7345c 1package File::Mkpath;
2
3=head1 NAME
4
5File::Mkpath - create or remove a series of directories
6
7=head1 SYNOPSIS
8
9C<use File::Mkpath>
10
11C<mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);>
12
13C<rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);>
14
15=head1 DESCRIPTION
16
17The C<mkpath> function provides a convenient way to create directories, even if
18your C<mkdir> kernel call won't create more than one level of directory at a
19time. C<mkpath> takes three arguments:
20
21=over 4
22
23=item *
24
25the name of the path to create, or a reference
26to a list of paths to create,
27
28=item *
29
30a boolean value, which if TRUE will cause C<mkpath>
31to print the name of each directory as it is created
32(defaults to FALSE), and
33
34=item *
35
36the numeric mode to use when creating the directories
37(defaults to 0777)
38
39=back
40
41It returns a list of all directories (including intermediates, determined using
42the Unix '/' separator) created.
43
44Similarly, the C<rmtree> function provides a convenient way to delete a
45subtree from the directory structure, much like the Unix command C<rm -r>.
46C<rmtree> takes three arguments:
47
48=over 4
49
50=item *
51
52the root of the subtree to delete, or a reference to
53a list of roots. All of the files and directories
54below each root, as well as the roots themselves,
55will be deleted. For the moment, C<rmtree> expects
56Unix file specification syntax.
57
58=item *
59
60a boolean value, which if TRUE will cause C<rmtree> to
61print a message each time it tries to delete a file,
62giving the name of the file, and indicating whether
63it's using C<rmdir> or C<unlink> to remove it.
64(defaults to FALSE)
65
66=item *
67
68a boolean value, which if TRUE will cause C<rmtree> to
69skip any files to which you do not have write access.
70This will change in the future when a criterion for
71'delete permission' is settled. (defaults to FALSE)
72
73=back
74
75It returns the number of files successfully deleted.
76
77=head1 AUTHORS
78
79Tim Bunce <Tim.Bunce@ig.co.uk>
80Charles Bailey <bailey@genetics.upenn.edu>
81
82=head1 REVISION
83
84This document was last revised 29-Jan-1995, for perl 5.001
85
86=cut
87
88require 5.000;
89use Config;
90use Carp;
91require Exporter;
92@ISA = qw( Exporter );
93@EXPORT = qw( mkpath rmtree );
94
95sub mkpath{
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
100 local($")="/";
101 $mode = 0777 unless defined($mode);
102 $paths = [$paths] unless ref $paths;
103 my(@created);
104 foreach $path (@$paths){
105 next if -d $path;
106 my(@p);
107 foreach(split(/\//, $path)){
108 push(@p, $_);
109 next if -d "@p/";
110 print "mkdir @p\n" if $verbose;
111 mkdir("@p",$mode) || croak "mkdir @p: $!";
112 push(@created, "@p");
113 }
114 }
115 @created;
116}
117
118sub rmtree {
119 my($roots, $verbose, $safe) = @_;
120 my(@files,$count);
121 $roots = [$roots] unless ref $roots;
122
123 foreach $root (@{$roots}) {
124 $root =~ s#/$##;
125 if (-d $root) {
126 opendir(D,$root);
127 @files = map("$root/$_", grep $_!~/^\.{1,2}$/, readdir(D));
128 closedir(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: $!";
133 }
134 else {
135 next if ($safe && !(-w $root));
136 print "unlink $root\n" if $verbose;
137 (unlink($root) && ++$count) or carp "Can't unlink file $root: $!";
138 }
139 }
140
141 $count;
142}
143
1441;
145
146__END__