簡(jiǎn)介
Mojo::File 是用于文件系統(tǒng)路徑的基于標(biāo)題的容器贷痪,它提供了一個(gè)友好的API來處理不同的操作系統(tǒng)。
函數(shù)
在Mojo::File模塊中實(shí)現(xiàn)的函數(shù)有:path、tempdir鄙皇、tempfile,可以單獨(dú)導(dǎo)入使用仰挣。下面分小節(jié)介紹伴逸。
path
my $path = path;
my $path = path('/home/sri/.vimrc');
my $path = path('/home', 'sri', '.vimrc');
my $path = path(File::Temp->newdir);
構(gòu)造一個(gè)新的基于標(biāo)量的Mojo::File對(duì)象,默認(rèn)使用當(dāng)前的工作目錄椎木。
# "foo/bar/baz.txt" (on UNIX)
path('foo', 'bar', 'baz.txt');
tempdir
my $path = tempdir;
my $path = tempdir('tempXXXXX');
使用File :: Temp為臨時(shí)目錄構(gòu)建一個(gè)新的基于標(biāo)量的Mojo :: File對(duì)象违柏。
# Longer version
my $path = path(File::Temp->newdir('tempXXXXX'));
tempfile
my $path = tempfile;
my $path = tempfile(DIR => '/tmp');
使用File :: Temp為臨時(shí)文件構(gòu)建一個(gè)新的基于標(biāo)量的Mojo :: File對(duì)象。
# Longer version
my $path = path(File::Temp->new(DIR => '/tmp'));
方法
basename
my $name = $path->basename;
my $name = $path->basename('.txt');
其實(shí)是調(diào)用了File::Basename 中的basename方法香椎,返回Mojo::File對(duì)象(路徑對(duì)象)的最后一層目錄名或文件名漱竖。詳情請(qǐng)參閱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');
返回一個(gè)相對(duì)于當(dāng)前對(duì)象所表示路徑的Mojo::File對(duì)象畜伐。也就是當(dāng)前對(duì)象所表示目錄下的子目錄或子文件的Mojo::File對(duì)象馍惹。
# "/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對(duì)文件進(jìn)行復(fù)制,并以Mojo::File對(duì)象的形式返回目標(biāo)文件玛界。
dirname
my $name = $path->dirname;
對(duì)當(dāng)前Mojo::File對(duì)象使用File::Basename模塊進(jìn)行處理万矾,得到除去最后一層級(jí)的目錄后得到路徑(PATH),然后把PATH包裝成Mojo::File對(duì)象返回慎框。
# "/home/sri" (on UNIX)
path('/home/sri/.vimrc')->dirname;
is_abs
my $bool = $path->is_abs;
檢查當(dāng)前Mojo::File對(duì)象中的PATH是否為絕對(duì)路徑良狈。
# 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});
列出目錄下的所有文件,并把每一個(gè)文件都包裝成Mojo::File對(duì)象笨枯,然后把所有Mojo::File對(duì)象包裝成一個(gè)Mojo::Collection對(duì)象返回薪丁。結(jié)果中不包括.
和..
遇西。
可用的選項(xiàng)
- dir (dir=>1);返回結(jié)果中包括子目錄。
- hidden (hidden=>1); 返回結(jié)果中包括隱藏目錄
list_tree
my $collection = $path->list_tree;
my $collection = $path->list_tree({hidden => 1});
遞歸地列出目錄下的所有文件严嗜、并把每一個(gè)文件都包裝成Mojo::File對(duì)象粱檀,然后把所有Mojo::File對(duì)象包裝成一個(gè)Mojo::Collection對(duì)象返回。結(jié)果中不包括.
和..
漫玄。
這個(gè)方法與list方法的區(qū)別在于茄蚯,此方法會(huì)遞歸列出所有子孫目錄下的所有文件,而list方法只列出直接子文件睦优。
# List all templates
say for path('/home/sri/myapp/templates')->list_tree->each;
可用選項(xiàng)
- dir (dir=>1);返回結(jié)果中包括子目錄渗常。
- hidden (hidden=>1); 返回結(jié)果中包括隱藏目錄
make_path
$path = $path->make_path;
$path = $path->make_path({mode => 0711});
如果Mojo::File所代表的目錄不存在就會(huì)創(chuàng)建這個(gè)目錄,所有參數(shù)都會(huì)交給File::Path模塊處理刨秆。其實(shí)它就是調(diào)用了File::Path::make_path
方法凳谦。
move_to
my $destination = $path->move_to('/home/sri');
my $destination = $path->move_to('/home/sri/.vimrc.backup');
使用File::Copy模塊移動(dòng)文件,并把目標(biāo)文件封閉成Mojo::File對(duì)象后返回衡未。
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);
構(gòu)造一個(gè)新的Mojo::File對(duì)象,默認(rèn)情況下使用當(dāng)前工作目錄家凯。
# "foo/bar/baz.txt" (on UNIX)
Mojo::File->new('foo', 'bar', 'baz.txt');
new方法的實(shí)現(xiàn)代碼如下:
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模塊打開一個(gè)文件缓醋。
# 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 函數(shù)處理Mojo::File對(duì)象所表示的目錄,把結(jié)果非常成Mojo::File對(duì)象后返回绊诲。
remove_tree
$path = $path->remove_tree;
$path = $path->remove_tree({keep_root => 1});
刪除Mojo::File對(duì)象所表示目錄下的所有文件和子目錄送粱。所有參數(shù)都會(huì)交給File::Path模塊下的remove_tree方法處理,其實(shí)它就是調(diào)用了File::Path::remove_tree
方法掂之。
sibling
my $sibling = $path->sibling('.vimrc');
構(gòu)造一個(gè)當(dāng)前Mojo::File所表示目錄的兄弟目錄或文件抗俄,并將得到的結(jié)果包裝成Mojo::File對(duì)象后返回。
# "/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;
從文件中讀取所有數(shù)據(jù)世舰。
spurt
$path = $path->spurt($bytes);
$path = $path->spurt(@chunks_of_bytes);
向文件中寫所有數(shù)據(jù)动雹。
tap
$path = $path->tap(sub {...});
調(diào)用了Mojo::Base::tap。
to_abs
my $absolute = $path->to_abs;
返回一個(gè)Mojo::File對(duì)象表示的絕對(duì)路徑跟压。這個(gè)路徑可以不存在于操作系統(tǒng)上胰蝠。
to_array
my $parts = $path->to_array;
把目錄切分成目錄的數(shù)組。
# "home:sri:.vimrc" (on UNIX)
join ':', @{path('/home/sri/.vimrc')->to_array};
to_rel
my $relative = $path->to_rel('/some/base/path');
相對(duì)于“參數(shù)中的路徑”求得當(dāng)前Mojo::File的相對(duì)路徑震蒋,并包裝成Mojo::File返回茸塞。
# "sri/.vimrc" (on UNIX)
path('/home/sri/.vimrc')->to_rel('/home');
to_string
my $str = $path->to_string;
把Mojo::File對(duì)象轉(zhuǎn)換成字符串。
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');
調(diào)用于了 Mojo::Base::with_roles查剖。
重載的操作符
@ARRAY
my @parts = @$path;
調(diào)用了 to_array
bool
my $bool = !!$path;
總是返回 true钾虐。
stringify
my $str = "$path";
調(diào)用了to_string。