Upgrade to IO 1.22 from gbarr
[p5sagit/p5-mst-13.2.git] / ext / IO / lib / IO / File.pm
CommitLineData
7a4c00b4 1#
2
8add82fc 3package IO::File;
4
5=head1 NAME
6
7IO::File - supply object methods for filehandles
8
9=head1 SYNOPSIS
10
11 use IO::File;
12
13 $fh = new IO::File;
774d564b 14 if ($fh->open("< file")) {
8add82fc 15 print <$fh>;
16 $fh->close;
17 }
18
774d564b 19 $fh = new IO::File "> file";
8add82fc 20 if (defined $fh) {
21 print $fh "bar\n";
22 $fh->close;
23 }
24
25 $fh = new IO::File "file", "r";
26 if (defined $fh) {
27 print <$fh>;
28 undef $fh; # automatically closes the file
29 }
30
31 $fh = new IO::File "file", O_WRONLY|O_APPEND;
32 if (defined $fh) {
33 print $fh "corge\n";
8add82fc 34
774d564b 35 $pos = $fh->getpos;
36 $fh->setpos($pos);
8add82fc 37
774d564b 38 undef $fh; # automatically closes the file
39 }
8add82fc 40
41 autoflush STDOUT 1;
42
43=head1 DESCRIPTION
44
55497cff 45C<IO::File> inherits from C<IO::Handle> and C<IO::Seekable>. It extends
27d4819a 46these classes with methods that are specific to file handles.
8add82fc 47
27d4819a 48=head1 CONSTRUCTOR
49
50=over 4
51
cf7fe8a2 52=item new ( FILENAME [,MODE [,PERMS]] )
27d4819a 53
d1be9408 54Creates an C<IO::File>. If it receives any parameters, they are passed to
27d4819a 55the method C<open>; if the open fails, the object is destroyed. Otherwise,
56it is returned to the caller.
57
9f01644e 58=item new_tmpfile
59
60Creates an C<IO::File> opened for read/write on a newly created temporary
61file. On systems where this is possible, the temporary file is anonymous
62(i.e. it is unlinked after creation, but held open). If the temporary
63file cannot be created or opened, the C<IO::File> object is destroyed.
64Otherwise, it is returned to the caller.
65
27d4819a 66=back
67
68=head1 METHODS
69
70=over 4
71
72=item open( FILENAME [,MODE [,PERMS]] )
73
73829507 74=item open( FILENAME, IOLAYERS )
75
27d4819a 76C<open> accepts one, two or three parameters. With one parameter,
cf7fe8a2 77it is just a front end for the built-in C<open> function. With two or three
8add82fc 78parameters, the first parameter is a filename that may include
79whitespace or other special characters, and the second parameter is
223d223e 80the open mode, optionally followed by a file permission value.
81
27d4819a 82If C<IO::File::open> receives a Perl mode string ("E<gt>", "+E<lt>", etc.)
d1be9408 83or an ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic
cf7fe8a2 84Perl C<open> operator (but protects any special characters).
223d223e 85
86If C<IO::File::open> is given a numeric mode, it passes that mode
87and the optional permissions value to the Perl C<sysopen> operator.
cf7fe8a2 88The permissions default to 0666.
89
73829507 90If C<IO::File::open> is given a mode that includes the C<:> character,
91it passes all the three arguments to the three-argument C<open> operator.
92
cf7fe8a2 93For convenience, C<IO::File> exports the O_XXX constants from the
94Fcntl module, if this module is available.
8add82fc 95
a84e44cd 96=item binmode( [LAYER] )
97
98C<binmode> sets C<binmode> on the underlying C<IO> object, as documented
99in C<perldoc -f binmode>.
100
101C<binmode> accepts one optional parameter, which is the layer to be
102passed on to the C<binmode> call.
103
27d4819a 104=back
105
fd172bcd 106=head1 NOTE
107
108Some operating systems may perform C<IO::File::new()> or C<IO::File::open()>
109on a directory without errors. This behavior is not portable and not
110suggested for use. Using C<opendir()> and C<readdir()> or C<IO::Dir> are
111suggested instead.
112
8add82fc 113=head1 SEE ALSO
114
115L<perlfunc>,
116L<perlop/"I/O Operators">,
fd172bcd 117L<IO::Handle>,
118L<IO::Seekable>,
119L<IO::Dir>
8add82fc 120
121=head1 HISTORY
122
cf7fe8a2 123Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
8add82fc 124
8add82fc 125=cut
126
3b825e41 127use 5.006_001;
7a4c00b4 128use strict;
17f410f9 129our($VERSION, @EXPORT, @EXPORT_OK, @ISA);
8add82fc 130use Carp;
131use Symbol;
8add82fc 132use SelectSaver;
8add82fc 133use IO::Seekable;
c7070406 134use File::Spec;
8add82fc 135
136require Exporter;
8add82fc 137
2c20ed41 138@ISA = qw(IO::Handle IO::Seekable Exporter);
8add82fc 139
35a60386 140$VERSION = "1.13";
8add82fc 141
142@EXPORT = @IO::Seekable::EXPORT;
143
cb628fe9 144eval {
145 # Make all Fcntl O_XXX constants available for importing
146 require Fcntl;
147 my @O = grep /^O_/, @Fcntl::EXPORT;
148 Fcntl->import(@O); # first we import what we want to export
149 push(@EXPORT, @O);
150};
8add82fc 151
8add82fc 152################################################
153## Constructor
154##
155
156sub new {
27d4819a 157 my $type = shift;
158 my $class = ref($type) || $type || "IO::File";
159 @_ >= 0 && @_ <= 3
160 or croak "usage: new $class [FILENAME [,MODE [,PERMS]]]";
8add82fc 161 my $fh = $class->SUPER::new();
162 if (@_) {
163 $fh->open(@_)
164 or return undef;
165 }
166 $fh;
167}
168
169################################################
170## Open
171##
172
173sub open {
174 @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
175 my ($fh, $file) = @_;
176 if (@_ > 2) {
177 my ($mode, $perms) = @_[2, 3];
178 if ($mode =~ /^\d+$/) {
179 defined $perms or $perms = 0666;
180 return sysopen($fh, $file, $mode, $perms);
73829507 181 } elsif ($mode =~ /:/) {
182 return open($fh, $mode, $file) if @_ == 3;
183 croak 'usage: $fh->open(FILENAME, IOLAYERS)';
8add82fc 184 }
f21dc558 185 if (defined($file) && length($file)
186 && ! File::Spec->file_name_is_absolute($file))
187 {
bfe0af6c 188 $file = File::Spec->rel2abs($file);
f21dc558 189 }
948ecc40 190 $file = IO::Handle::_open_mode_string($mode) . " $file\0";
8add82fc 191 }
192 open($fh, $file);
193}
194
a84e44cd 195################################################
196## Binmode
197##
198
199sub binmode {
1561aefc 200 ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])';
a84e44cd 201
202 my($fh, $layer) = @_;
203
204 return binmode $$fh unless $layer;
205 return binmode $$fh, $layer;
206}
207
8add82fc 2081;