Directory-Scratch
view release on metacpan or search on metacpan
lib/Directory/Scratch.pm view on Meta::CPAN
if($platform){
my $dir = Path::Class::foreign_dir($platform, @_);
return $dir->as_foreign($OUR_PLATFORM);
}
else {
return Path::Class::dir(@_);
}
}
sub exists {
my $self = shift;
my $file = shift;
my $base = $self->base;
my $path = $self->_foreign_file($base, $file);
return dir($path) if -d $path;
return $path if -e $path;
return; # undef otherwise
}
sub stat {
my $self = shift;
my $file = shift;
my $path = $self->_foreign_file($self->base, $file);
if(wantarray){
return stat $path; # core stat, returns a list
}
return File::stat::stat($path); # returns an object
}
sub mkdir {
my $self = shift;
my $dir = shift;
my $base = $self->base;
$dir = $self->_foreign_dir($base, $dir);
$dir->mkpath;
return $dir if (-e $dir && -d $dir);
croak "Error creating $dir: $!";
}
sub link {
my $self = shift;
my $from = shift;
my $to = shift;
my $base = $self->base;
croak "Symlinks are not supported on MSWin32"
if $^O eq 'MSWin32';
$from = $self->_foreign_file($base, $from);
$to = $self->_foreign_file($base, $to);
symlink($from, $to)
or croak "Couldn't link $from to $to: $!";
return $to;
}
sub chmod {
my $self = shift;
my $mode = shift;
my @paths = @_;
my @translated = map { $self->_foreign_file($self->base, $_) } @paths;
return chmod $mode, @translated;
}
sub read {
my $self = shift;
my $file = shift;
my $base = $self->base;
$file = $self->_foreign_file($base, $file);
croak "Cannot read $file: is a directory" if -d $file;
if(wantarray){
my @lines = path($file->stringify)->lines;
chomp @lines;
return @lines;
}
else {
my $scalar = path($file->stringify)->slurp;
chomp $scalar;
return $scalar;
}
}
sub write {
my $self = shift;
my $file = shift;
my $base = $self->base;
my $path = $self->_foreign_file($base, $file);
$path->parent->mkpath;
croak "Couldn't create parent dir ". $path->parent. ": $!"
unless -e $path->parent;
# figure out if we're "write" or "append"
my (undef, undef, undef, $method) = caller(1);
my $args;
if(defined $method && $method eq 'Directory::Scratch::append'){
local $, = $, || "\n";
path($path->stringify)->append(@_, '')
or croak "Error writing file: $!";
}
else { # (cut'n'paste)++
local $, = $, || "\n";
path($path->stringify)->append({ truncate => 1 }, @_, '')
or croak "Error writing file: $!";
}
return 1;
}
sub append {
return &write(@_); # magic!
}
sub tempfile {
my $self = shift;
my $path = shift;
if(!defined $path){
$path = $self->base;
lib/Directory/Scratch.pm view on Meta::CPAN
If you wrote the file with C<$,> set, you'll want to set C<$/> to
C<$,> when reading the file back in:
local $, = '!';
$tmp->touch('foo', qw{foo bar baz}); # writes "foo!bar!baz!" to disk
scalar $tmp->read('foo') # returns "foo!bar!baz!"
$tmp->read('foo') # returns ("foo!bar!baz!")
local $/ = '!';
$tmp->read('foo') # returns ("foo", "bar", "baz")
=head2 write($file, @lines)
Replaces the contents of file with @lines. Each line will be ended
with a C<\n>, or C<$,> if it is defined. The file will be created if
necessary.
=head2 append($file, @lines)
Appends @lines to $file, as per C<write>.
=head2 randfile()
Generates a file with random string data in it. If String::Random is
available, it will be used to generate the file's data. Takes 0,
1, or 2 arguments - default size, max size, or size range.
A max size of 0 will cause an exception to be thrown.
Examples:
my $file = $temp->randfile(); # size is between 1024 and 131072
my $file = $temp->randfile( 4192 ); # size is below 4129
my $file = $temp->randfile( 1000000, 4000000 );
=head2 link($from, $to)
Symlinks a file in the temporary directory to another file in the
temporary directory.
Note: symlinks are not supported on Win32. Portable code must not use
this method. (The method will C<croak> if it won't work.)
=head2 ls([$path])
Returns a list (in no particular order) of all files below C<$path>.
If C<$path> is omitted, the root is assumed. Note that directories
are not returned.
If C<$path> does not exist, an exception is thrown.
=head2 delete($path)
Deletes the named file or directory at $path.
If the path is removed successfully, the method returns true.
Otherwise, an exception is thrown.
(Note: delete means C<unlink> for a file and C<rmdir> for a directory.
C<delete>-ing an unempty directory is an error.)
=head2 chmod($octal_permissions, @files)
Sets the permissions C<$octal_permissions> on C<@files>, returning the
number of files successfully changed. Note that C<'0644'> is
C<--w----r-T>, not C<-rw-r--r-->. You need to pass in C<oct('0644')>
or a literal C<0644> for this method to DWIM. The method is just a
passthru to perl's built-in C<chmod> function, so see C<perldoc -f
chmod> for full details.
=head2 cleanup
Forces an immediate cleanup of the current object's directory. See
File::Path's rmtree(). It is not safe to use the object after this
method is called.
=head1 ENVIRONMENT
If the C<PERL_DIRECTORYSCRATCH_CLEANUP> variable is set to 0, automatic
cleanup will be suppressed.
=head1 PATCHES
Commentary, patches, etc. are most welcome. If you send a patch,
try patching the git version available from:
L<git://git.jrock.us/Directory-Scratch>.
You can check out a copy by running:
git clone git://git.jrock.us/Directory-Scratch
Then you can use git to commit changes and then e-mail me a patch, or
you can publish the repository and ask me to pull the changes. More
information about git is available from
L<http://git.or.cz/>
=head1 SEE ALSO
L<File::Temp>
L<File::Path>
L<File::Spec>
L<Path::Class>
=head1 BUGS
Please report any bugs or feature through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Directory-Scratch>.
=head1 ACKNOWLEDGEMENTS
Thanks to Al Tobey (TOBEYA) for some excellent patches, notably:
=over 4
=item C<child>
=item Random Files (C<randfile>)
=item C<tempfile>
=item C<openfile>
=back
=head1 COPYRIGHT & LICENSE
Copyright 2006 Jonathan Rockway, all rights reserved.
( run in 0.486 second using v1.01-cache-2.11-cpan-39bf76dae61 )