Mojo::File

简介

Mojo::File 是用于文件系统路径的基于标题的容器,它提供了一个友好的API来处理不同的操作系统。

函数

在Mojo::File模块中实现的函数有:path、tempdir、tempfile,可以单独导入使用。下面分小节介绍。

path

my $path = path;
my $path = path('/home/sri/.vimrc');
my $path = path('/home', 'sri', '.vimrc');
my $path = path(File::Temp->newdir);

构造一个新的基于标量的Mojo::File对象,默认使用当前的工作目录。

# "foo/bar/baz.txt" (on UNIX)
path('foo', 'bar', 'baz.txt');

tempdir

my $path = tempdir;
my $path = tempdir('tempXXXXX');

使用File :: Temp为临时目录构建一个新的基于标量的Mojo :: File对象。

# Longer version
my $path = path(File::Temp->newdir('tempXXXXX'));

tempfile

my $path = tempfile;
my $path = tempfile(DIR => '/tmp');

使用File :: Temp为临时文件构建一个新的基于标量的Mojo :: File对象。

# Longer version
my $path = path(File::Temp->new(DIR => '/tmp'));

方法

basename

my $name = $path->basename;
my $name = $path->basename('.txt');

其实是调用了File::Basename 中的basename方法,返回Mojo::File对象(路径对象)的最后一层目录名或文件名。详情请参阅File::Basename模块。

# ".vimrc" (on UNIX)
path('/home/sri/.vimrc')->basename;

# "test" (on UNIX)
path('/home/sri/test.txt')->basename('.txt');

child

my $child = $path->child('.vimrc');

返回一个相对于当前对象所表示路径的Mojo::File对象。也就是当前对象所表示目录下的子目录或子文件的Mojo::File对象。

# "/home/sri/.vimrc" (on UNIX)
path('/home')->child('sri', '.vimrc');

copy_to

my $destination = $path->copy_to('/home/sri');
my $destination = $path->copy_to('/home/sri/.vimrc.backup');

使用File::Copy对文件进行复制,并以Mojo::File对象的形式返回目标文件。

dirname

my $name = $path->dirname;

对当前Mojo::File对象使用File::Basename模块进行处理,得到除去最后一层级的目录后得到路径(PATH),然后把PATH包装成Mojo::File对象返回。

# "/home/sri" (on UNIX)
path('/home/sri/.vimrc')->dirname;

is_abs

my $bool = $path->is_abs;

检查当前Mojo::File对象中的PATH是否为绝对路径。

# True (on UNIX)
path('/home/sri/.vimrc')->is_abs;

# False (on UNIX)
path('.vimrc')->is_abs;

list

my $collection = $path->list;
my $collection = $path->list({hidden => 1});

列出目录下的所有文件,并把每一个文件都包装成Mojo::File对象,然后把所有Mojo::File对象包装成一个Mojo::Collection对象返回。结果中不包括...

可用的选项

  1. dir (dir=>1);返回结果中包括子目录。
  2. hidden (hidden=>1); 返回结果中包括隐藏目录

list_tree

my $collection = $path->list_tree;
my $collection = $path->list_tree({hidden => 1});

递归地列出目录下的所有文件、并把每一个文件都包装成Mojo::File对象,然后把所有Mojo::File对象包装成一个Mojo::Collection对象返回。结果中不包括...

这个方法与list方法的区别在于,此方法会递归列出所有子孙目录下的所有文件,而list方法只列出直接子文件。

# List all templates
say for path('/home/sri/myapp/templates')->list_tree->each;

可用选项

  1. dir (dir=>1);返回结果中包括子目录。
  2. hidden (hidden=>1); 返回结果中包括隐藏目录

make_path

$path = $path->make_path;
$path = $path->make_path({mode => 0711});

如果Mojo::File所代表的目录不存在就会创建这个目录,所有参数都会交给File::Path模块处理。其实它就是调用了File::Path::make_path方法。

move_to

my $destination = $path->move_to('/home/sri');
my $destination = $path->move_to('/home/sri/.vimrc.backup');

使用File::Copy模块移动文件,并把目标文件封闭成Mojo::File对象后返回。

new

my $path = Mojo::File->new;
my $path = Mojo::File->new('/home/sri/.vimrc');
my $path = Mojo::File->new('/home', 'sri', '.vimrc');
my $path = Mojo::File->new(File::Temp->new);
my $path = Mojo::File->new(File::Temp->newdir);

构造一个新的Mojo::File对象,默认情况下使用当前工作目录。

# "foo/bar/baz.txt" (on UNIX)
Mojo::File->new('foo', 'bar', 'baz.txt');

new方法的实现代码如下:

sub new {
  my $class = shift;
  my $value = @_ == 1 ? $_[0] : @_ > 1 ? catfile @_ : canonpath getcwd;
  return bless \$value, ref $class || $class;
}

open

my $handle = $path->open('+<');
my $handle = $path->open('r+');
my $handle = $path->open(O_RDWR);
my $handle = $path->open('<:encoding(UTF-8)');

使用IO::FIle模块打开一个文件。

# Combine "fcntl.h" constants
use Fcntl qw(O_CREAT O_EXCL O_RDWR);
my $handle = path('/home/sri/test.pl')->open(O_RDWR | O_CREAT | O_EXCL);

realpath

my $realpath = $path->realpath;

使用Cwd模块中的 realpath 函数处理Mojo::File对象所表示的目录,把结果非常成Mojo::File对象后返回。

remove_tree

$path = $path->remove_tree;
$path = $path->remove_tree({keep_root => 1});

删除Mojo::File对象所表示目录下的所有文件和子目录。所有参数都会交给File::Path模块下的remove_tree方法处理,其实它就是调用了File::Path::remove_tree方法。

sibling

my $sibling = $path->sibling('.vimrc');

构造一个当前Mojo::File所表示目录的兄弟目录或文件,并将得到的结果包装成Mojo::File对象后返回。

# "/home/sri/.vimrc" (on UNIX)
path('/home/sri/.bashrc')->sibling('.vimrc');

# "/home/sri/.ssh/known_hosts" (on UNIX)
path('/home/sri/.bashrc')->sibling('.ssh', 'known_hosts');

slurp

my $bytes = $path->slurp;

从文件中读取所有数据。

spurt

$path = $path->spurt($bytes);
$path = $path->spurt(@chunks_of_bytes);

向文件中写所有数据。

tap

$path = $path->tap(sub {...});

调用了Mojo::Base::tap。

to_abs

my $absolute = $path->to_abs;

返回一个Mojo::File对象表示的绝对路径。这个路径可以不存在于操作系统上。

to_array

my $parts = $path->to_array;

把目录切分成目录的数组。

# "home:sri:.vimrc" (on UNIX)
join ':', @{path('/home/sri/.vimrc')->to_array};

to_rel

my $relative = $path->to_rel('/some/base/path');

相对于“参数中的路径”求得当前Mojo::File的相对路径,并包装成Mojo::File返回。

# "sri/.vimrc" (on UNIX)
path('/home/sri/.vimrc')->to_rel('/home');

to_string

my $str = $path->to_string;

把Mojo::File对象转换成字符串。

with_roles

my $new_class = Mojo::File->with_roles('Mojo::File::Role::One');
my $new_class = Mojo::File->with_roles('+One', '+Two');
$path         = $path->with_roles('+One', '+Two');

调用于了 Mojo::Base::with_roles。

重载的操作符

@ARRAY

my @parts = @$path;

调用了 to_array

bool

my $bool = !!$path;

总是返回 true。

stringify

my $str = "$path";

调用了to_string。

你可能感兴趣的:(Mojo::File)