简介
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对象返回。结果中不包括.
和..
。
可用的选项
- dir (dir=>1);返回结果中包括子目录。
- 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;
可用选项
- dir (dir=>1);返回结果中包括子目录。
- 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。
网友评论