名前

Mojo::File - ファイルシステムのパス

使い方

use Mojo::File;

# ポータブルにファイルシステムのパスを扱う
my $path = Mojo::File->new('/home/sri/.vimrc');
say $path->slurp;
say $path->dirname;
say $path->basename;
say $path->sibling('.bashrc');

# もう一つのコンストラクタを使う
use Mojo::File 'path';
my $path = path('/tmp/foo/bar')->make_path;
$path->child('test.txt')->spurt('Hello Mojo!');

説明

Mojo::Fileは、ファイルシステムのパスのためのスカラベースのコンテナで、異なるオペレーティングシステムのを扱うためのフレンドリーなAPIを提供します。

# パスを処理するために直接スカラにアクセスする
my $path = Mojo::File->new('/home/sri/test');
$$path .= '.txt';

関数

Mojo::File次の関数を実装しており、個別にインポートできます。

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オブジェクトを構築します。

# 長いバージョン
my $path = path(File::Temp->newdir('tempXXXXX'));

tempfile

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

File::Tempを使って一時ファイルのための、新しいスカラベースのMojo::Fileオブジェクトを構築します。

# 長いバージョン
my $path = path(File::Temp->new(DIR => '/tmp'));

メソッド

Mojo::File implements the following methods.

basename

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

 L<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オブジェクトを返します。

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

chmod

$path = $path->chmod(0644);

ファイルのパーミッションを変更します。

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;

File::Basenameを使って、パスの最後のレベルを除いたすべてを、Mojo::Fileオブジェクトとして返します。

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

is_abs

my $bool = $path->is_abs;

パスが絶対かチェックします。

# 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::Collectionオブジェクトを返します。このリストは.を含みません。

# ファイルをリストする
say for path('/home/sri/myapp')->list->each;

次のオプションがが現在利用可能です。

dir
dir => 1

ディレクトリを含む

hidden
hidden => 1

隠しファイルを含む

list_tree

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

ディレクトリの中にあるすべてのファイルを再帰的にリストし、Mojo::Fileオブジェクトとして結果を含む、Mojo::Collectionオブジェクトを返します。このリストは...を含みません。

# すべてのテンプレートを取得
say for path('/home/sri/myapp/templates')->list_tree->each;

次のオプションがが現在利用可能です。

dir
dir => 1

ディレクトリを含む

dont_use_nlink
dont_use_nlink => 1

File::Findがいつでもディレクトリをstatできるように強制します。

hidden
hidden => 1

隠しファイルと隠しディレクトリを含む

max_depth
max_depth => 3

ファイル検索するときに下りてゆく最大のレベル

lstat

my $stat = $path->lstat;

シンボリックリンクのためのFile::statオブジェクトを返します。

# シンボリックリンクのサイズを取得
say path('/usr/sbin/sendmail')->lstat->size;

# シンボリックリンクの修正時刻を取得
say path('/usr/sbin/sendmail')->lstat->mtime;

make_path

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

まだ存在していない場合、複数階層のディレクトリを作成します。追加の引数はFile::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');

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でファイルをオープンします。

# "fcntl.h" の定数も使う
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でパスを解決し、結果をMojo::Fileオブジェクトとして返します。

remove

$path = $path->remove;

ファイルを削除します。

remove_tree

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

ディレクトリとサブディレクトリに含まれるファイルを削除します。追加の引数はFile::Pathに渡されます。

sibling

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

パスのディレクトリの部分への相対で、新しいMojo::Filオブジェクトを返します。

# "/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);

ファイルへすべてのデータを書き出します。

stat

my $stat = $path->stat;

パスのためのFile::statオブジェクトを返します。

# ファイルサイズを取得
say path('/home/sri/.bashrc')->stat->size;

# ファイルの修正時刻を取得
say path('/home/sri/.bashrc')->stat->mtime;

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オブジェクトとして返します。

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

to_string

my $str = $path->to_string;

パスを文字列化します。

touch

$path = $path->touch;

存在しなければ、ファイルを作成し、そうでない場合は、修正時刻とアクセス時刻を現在の時間に更新します。

# 安全なファイルの読み込み
say path('.bashrc')->touch->slurp;

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"のエイリアス。

演算子

Mojo::Fileは次の演算子をオーバーライドしています。

array

my @parts = @$path;

"to_array"のエイリアス。

bool

my $bool = !!$path;

いつでも真。

stringify

my $str = "$path";

"to_string"のエイリアス

参考

Mojolicious, Mojolicious::Guides, https://mojolicious.org.

(Mojolicious 8.12。2019年5月16日更新)

関連情報