Aion-Fs
view release on metacpan or search on metacpan
lib/Aion/Fs.pm view on Meta::CPAN
my ($file) = @_ == 0? $_: @_;
my $layer = ":utf8";
($file, $layer) = @$file if ref $file;
open my $f, "<$layer", $file or die "cat $file: $!";
read $f, my $x, -s $f;
close $f;
$x
}
# ÐапиÑаÑÑ Ñайл
sub lay ($;$) {
my ($file, $s) = @_ == 1? ($_, @_): @_;
my $layer = ":utf8";
($file, $layer) = @$file if ref $file;
open my $f, ">$layer", $file or die "lay $file: $!";
local $\;
print $f $s;
close $f;
$file
}
# СÑиÑаÑÑ Ñайл, еÑли он еÑÑ Ð½Ðµ бÑл ÑÑиÑан
our %FILE_INC;
sub catonce (;$) {
my ($file) = @_ == 0? $_: @_;
die "catonce not use ref path!" if ref $file;
return undef if exists $FILE_INC{$file};
$FILE_INC{$file} = 1;
cat $file
}
use constant {
DEV_NO => 0, # ÐÐ¾Ð¼ÐµÑ ÑÑÑÑойÑÑва
INO_NO => 1, # ÐÐ¾Ð¼ÐµÑ inode
MODE_NO => 2, # Режим Ñайла (пÑава доÑÑÑпа)
NLINK_NO => 3, # ÐолиÑеÑÑво жеÑÑкиÑ
ÑÑÑлок
UID_NO => 4, # ÐденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ-владелÑÑа
GID_NO => 5, # ÐденÑиÑикаÑÐ¾Ñ Ð³ÑÑппÑ-владелÑÑа
RDEV_NO => 6, # ÐÐ¾Ð¼ÐµÑ ÑÑÑÑойÑÑва (еÑли ÑÑо ÑпеÑиалÑнÑй Ñайл)
SIZE_NO => 7, # Ð Ð°Ð·Ð¼ÐµÑ Ñайла в байÑаÑ
ATIME_NO => 8, # ÐÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑÑÑпа
MTIME_NO => 9, # ÐÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ
CTIME_NO => 10, # ÐÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ inode
BLKSIZE_NO => 11, # Ð Ð°Ð·Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ввода-вÑвода
BLOCKS_NO => 12, # ÐолиÑеÑÑво вÑделеннÑÑ
блоков
};
# ÐеÑнÑÑÑ Ð²ÑÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑии Ñайла
sub mtime(;$) {
my ($file) = @_ == 0? $_: @_;
($file) = @$file if ref $file;
(Time::HiRes::stat $file)[MTIME_NO] // die "mtime $file: $!"
}
# ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñайле в виде Ñ
еÑа
sub sta(;$) {
my ($path) = @_ == 0? $_: @_;
($path) = @$path if ref $path;
my %sta = (path => $path);
@sta{qw/dev ino mode nlink uid gid rdev size atime mtime ctime blksize blocks/} = Time::HiRes::stat $path or die "sta $path: $!";
# @sta{qw/
# user_can_exec user_can_read user_can_write
# group_can_exec group_can_read group_can_write
# other_can_exec other_can_read other_can_write
# /} = (
#
# );
\%sta
}
# ФайловÑе ÑилÑÑÑÑ
sub _filters(@) {
map {
if(ref $_ eq "CODE") {$_}
elsif(ref $_ eq "Regexp") { my $re = $_; sub { $_ =~ $re } }
elsif(/^-([a-z]+)$/) {
eval join "", "sub { ", (join " && ", map "-$_()", split //, $1), " }"
}
else { my $re = wildcard(); sub { $_ =~ $re } }
} @_
}
# ÐайÑи ÑайлÑ
sub find(;@) {
my $files = @_? shift: $_;
$files = [$files] unless ref $files;
my @noenters; my $errorenter = sub {};
my $ex = @_ && ref($_[$#_]) eq 'Aion::Fs::Find'
? pop
: undef;
if($ex) {
bless $ex, 'Aion::Fs';
if(Scalar::Util::reftype $ex eq 'CODE') {
$errorenter = $ex;
} else {
$errorenter = bless pop @$ex, undef if Scalar::Util::reftype($ex->[$#$ex]) eq "CODE";
push @noenters, _filters @$ex;
}
}
my @filters = _filters @_;
my $iter = Aion::Fs::Find->new(
noenters => \@noenters,
errorenter => $errorenter,
filters => \@filters,
files => $files,
);
defined(wantarray)
? (wantarray? @$iter: $iter)
: do { while(defined $iter->next) {} };
}
# Ðе вÑ
одиÑÑ Ð² подкаÑалоги
sub noenter(@) {
bless [@_], "Aion::Fs::Find"
( run in 1.395 second using v1.01-cache-2.11-cpan-ceb78f64989 )