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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容