Pod-Query
view release on metacpan or search on metacpan
t/cpan/Mojo/File.pm view on Meta::CPAN
package Mojo::File;
use Mojo::Base -strict;
use overload '@{}' => sub { shift->to_array }, bool => sub {1}, '""' => sub { ${$_[0]} }, fallback => 1;
use Carp qw(croak);
use Cwd qw(getcwd);
use Exporter qw(import);
use File::Basename ();
use File::Copy qw(copy move);
use File::Find qw(find);
use File::Path ();
use File::Spec::Functions qw(abs2rel canonpath catfile file_name_is_absolute rel2abs splitdir);
use File::stat ();
use File::Temp ();
use IO::File ();
use Mojo::Collection;
our @EXPORT_OK = ('curfile', 'path', 'tempdir', 'tempfile');
sub basename { File::Basename::basename ${shift()}, @_ }
sub child { $_[0]->new(${shift()}, @_) }
sub chmod {
my ($self, $mode) = @_;
chmod $mode, $$self or croak qq{Can't chmod file "$$self": $!};
return $self;
}
sub copy_to {
my ($self, $to) = @_;
copy($$self, $to) or croak qq{Can't copy file "$$self" to "$to": $!};
return $self->new(-d $to ? ($to, File::Basename::basename $self) : $to);
}
sub curfile { __PACKAGE__->new(Cwd::realpath((caller)[1])) }
sub dirname { $_[0]->new(scalar File::Basename::dirname ${$_[0]}) }
sub extname { shift->basename =~ /.+\.([^.]+)$/ ? $1 : '' }
sub is_abs { file_name_is_absolute ${shift()} }
sub list {
my ($self, $options) = (shift, shift // {});
return Mojo::Collection->new unless -d $$self;
opendir(my $dir, $$self) or croak qq{Can't open directory "$$self": $!};
my @files = grep { $_ ne '.' && $_ ne '..' } readdir $dir;
@files = grep { !/^\./ } @files unless $options->{hidden};
@files = map { catfile $$self, $_ } @files;
@files = grep { !-d } @files unless $options->{dir};
return Mojo::Collection->new(map { $self->new($_) } sort @files);
}
sub list_tree {
my ($self, $options) = (shift, shift // {});
# This may break in the future, but is worth it for performance
local $File::Find::skip_pattern = qr/^\./ unless $options->{hidden};
# The File::Find documentation lies, this is needed for CIFS
local $File::Find::dont_use_nlink = 1 if $options->{dont_use_nlink};
my %all;
my $wanted = sub {
if ($options->{max_depth}) {
(my $rel = $File::Find::name) =~ s!^\Q$$self\E/?!!;
$File::Find::prune = 1 if splitdir($rel) >= $options->{max_depth};
}
$all{$File::Find::name}++ if $options->{dir} || !-d $File::Find::name;
};
find {wanted => $wanted, no_chdir => 1}, $$self if -d $$self;
delete $all{$$self};
return Mojo::Collection->new(map { $self->new(canonpath $_) } sort keys %all);
}
sub lstat { File::stat::lstat(${shift()}) }
sub make_path {
my $self = shift;
File::Path::make_path $$self, @_;
return $self;
}
sub move_to {
my ($self, $to) = @_;
move($$self, $to) or croak qq{Can't move file "$$self" to "$to": $!};
return $self->new(-d $to ? ($to, File::Basename::basename $self) : $to);
}
sub new {
my $class = shift;
croak 'Invalid path' if grep { !defined } @_;
( run in 2.344 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )