=encoding utf8 =head1 NAME Path::Class::Dir - ディレクトリのオブジェクト表現 =head1 SYNOPSIS use Path::Class qw(dir); # 短いコンストラクタのエクスポート my $dir = dir('foo', 'bar'); # Path::Class::Dirオブジェクト my $dir = Path::Class::Dir->new('foo', 'bar'); # 同様 # Unixでは'foo/bar'、Windowsでは'foo\bar'などに文字列化 print "dir: $dir\n"; if ($dir->is_absolute) { ... } my $v = $file->volume; # Windowsでは'C:'、Unixではから文字列、 # Mac OSでは'Macintosh HD:'など $file->cleanup; # パスネームの論理的なクリーンナップ my $file = $dir->file('file.txt'); # このディレクトリ内のファイル my $subdir = $dir->subdir('george'); # サブディレクトリ my $parent = $dir->parent; # 親ディレクトリ'foo' my $abs = $dir->absolute; # 絶対パスへの変換 my $rel = $abs->relative; # 相対パスへの変換 my $rel = $abs->relative('/foo'); # /fooへの相対パス print $dir->as_foreign('MacOS'); # :foo:bar: print $dir->as_foreign('Win32'); # foo\bar # IO::Dirメソッドによるイテレート: my $handle = $dir->open; while (my $file = $handle->read) { $file = $dir->file($file); # Turn into Path::Class::File object ... } # Path::Classメソッドによるイテレート: while (my $file = $dir->next) { # $fileはPath::Class::FileまたはPath::Class::Dirオブジェクト ... } =head1 DESCRIPTION Cクラスはクロス・プラットフォームな方法でのディレクトリ名の操作のための機能を含みます。 =head1 METHODS =over 4 =item $dir = Path::Class::Dir->new( , , ... ) =item $dir = dir( , , ... ) Cオブジェクトを生成し、これを返します。 この引数では、連結されて単一のディレクトリオブジェクトを生成するのに使われるディレクトリ名を指定します。 何らかのボリュームを最初の引数で、あるいは最初の引数の一部分で指定することができます。 プラットフォーム-ニュートラルな記述: my $dir = dir( 'foo', 'bar', 'baz' ); あるいは、プラットフォーム-ネイティブな記述: my $dir = dir( 'foo/bar/baz' ); あるいは、この二つの混合ができます: my $dir = dir( 'foo/bar', 'baz' ); 上の三つの例はいずれも、相対パスを生成します。 絶対パスを生成するには、プラットフォーム-ネイティブな次のような記述: my $dir = dir( '/var/tmp' ); または最初の引数としてから文字列を記述します: my $dir = dir( '', 'var', 'tmp' ); 二番目の形式は不恰好に見えるとすれば、それは意図的なことです - 最初に挙げたCあるいはC<\Windows>のようなパスはクロスプラットフォームのコンセプトではなく、もしあなたがコードをクロスプラットフォームにしようとしているなら、おそらくその中に現れるべきではありません。 これが設定ファイル、ユーザ入力、その他から与えられるのであれば、最初の形態はあらゆる意味ですばらしいものです。 特別なケースとして、有用でありこの方法で定義できると便利だからという以外の意味はありませんが、C<< Path::Class::Dir->new() >>(あるいはC)は現在のディレクトリ(C<< File::Spec->curdir >>)を指します。現在のディレクトリを絶対パスで得るには、C<< dir()->absolute >>とします。 =item $dir->stringify このメソッドはCが文字列コンテクストで使われたときに自動的に呼ばれるもので、したがって以下は同じことになります: $string = $dir->stringify; $string = "$dir"; =item $dir->volume このディレクトリオブジェクトにボリューム(例えば、WindowsではC、Mac OSではCなど)があれば、それを返します。 そうでなければ、空文字列を返します。 =item $dir->is_dir このオブジェクトがディレクトリをあらわしているか、boolean(真偽)値で返します。 当然のことですが、Cは常にfalseを返しますし、Cは常にtrueを返します。 =item $dir->is_absolute ディレクトリが絶対パス指定(CやC<\Windows>のように)を指しているか否かに応じて、trueかfalseを返します。 =item $dir->cleanup ファイルパスの論理的なクリーンナップを行います。例えば: my $dir = dir('/foo//baz/./foo')->cleanup; # $dirは'/foo/baz/foo'をあらわします; =item $file = $dir->file( , , ..., ) C<$dir>またはこのサブディレクトリの一つの中のものをあらわすCオブジェクトを返します。 内部的には、C<< Path::Class::File->new( @_ ) >>を呼ぶだけです。 =item $subdir = $dir->subdir( , , ... ) C<$dir>のサブディレクトリをあらわす新しいCオブジェクトを返します。 =item $parent = $dir->parent C<$dir>の親ディレクトリを返します。 これはI<論理的な>親であり、必ずしも物理的な親であるとは限らないことに注意指定下さい。 実際に意味するのは、これいじょう切り落とせなくなるまで、ディレクトリリストの末端からエントリを切り落とすというだけです。 もしディレクトリが相対であれば、親ディレクトリの相対での形式を使用するところから始めます。 以下のコードは絶対及び相対ディレクトリの振る舞いのデモンストレーションです: $dir = dir('/foo/bar'); for (1..6) { print "Absolute: $dir\n"; $dir = $dir->parent; } $dir = dir('foo/bar'); for (1..6) { print "Relative: $dir\n"; $dir = $dir->parent; } ########### Output on Unix ################ Absolute: /foo/bar Absolute: /foo Absolute: / Absolute: / Absolute: / Absolute: / Relative: foo/bar Relative: foo Relative: . Relative: .. Relative: ../.. Relative: ../../.. =item @list = $dir->children このディレクトリ内のオブジェクトをリストアップし、CおよびCのリスト、またはスカラコンテキストではその数として返します。 分かりきったことですが、子を検索するためにはC<$dir>が存在し、読み込み可能であることが必要です。 子はC<$dir>のサブディレクトリとして、つまりFの子はFやFではなく、FやFとして返されることに注意してください。 基本的に、CはIとIにあたるエントリーのC<.>やC<..>(あるいは非Unixシステムのこれにあたるもの)を含みません。 これはI'm-my-own-grandpaビジネスのようなものですから。 これらの特別なものを含むディレクトリ・エントリが欲しいのであれば、Cにtrueの値を渡してください: @c = $dir->children(); # 子のみ @c = $dir->children(all => 1); # 全てのエントリ =item $abs = $dir->absolute C<$dir>を絶対パスであらわしたCオブジェクトを返します。 追加引数として、文字列かCオブジェクトで、相対パスのベースとして使われるディレクトリを指定することができます。 指定しなかった時は、現在のワーキング・ディレクトリが使われます。 =item $rel = $dir->relative C<$dir>を相対パスであらわしたCオブジェクトを返します。 追加引数として、文字列かCオブジェクトで、相対パスのベースとして使われるディレクトリを指定することができます。 指定しなかった時は、現在のワーキング・ディレクトリが使われます。 =item $boolean = $dir->subsumes($other) ディレクトリ指定が、他方のディレクトリ指定に含まれているものであればtrueを、そうでなければfalseを返します。 "subsumes"は"contains"だと考えることもできますが、C<$dir>が実際にファイルシステム上でC<$other>を含んでいるかではなく、I<指定>だけを見ています。 C<$other>引数はCオブジェクト、Cオブジェクト、文字列のどれでもかまいません。 最後のケースでは、これをディレクトリであると仮定します。 # 例: dir('foo/bar' )->subsumes(dir('foo/bar/baz')) # True dir('/foo/bar')->subsumes(dir('/foo/bar/baz')) # True dir('foo/bar' )->subsumes(dir('bar/baz')) # False dir('/foo/bar')->subsumes(dir('foo/bar')) # False =item $foreign = $dir->as_foreign($type) C<$dir>をC<$type>タイプのシステムで指定した場合のCオブジェクトを返します。 既知のタイプにはC、C、C、C、そしてC、つまりCにサブクラスがあるすべてのものが含まれます。 生成されたオブジェクト(サブディレクトリ、ファイル、親ディレクトリなど)はこのタイプを保持します。 =item $foreign = Path::Class::Dir->new_foreign($type, @args) C<$dir>をC<$type>タイプのシステムで指定した場合のCオブジェクトを返します。 既知のタイプにはC、C、C、C、そしてC、つまりCにサブクラスがあるすべてのものが含まれます。 C<@args>に含まれる引数は、Cで指定されるものと同じです。 =item @list = $dir->dir_list([OFFSET, [LENGTH]]) このディレクトリ構成を内部的に示す文字列のリストを返します。 リストのそれぞれの連続したメンバーは、その前のもののディレクトリリストのエントリーだと理解されます。 約束として、C<< Path::Class->new( $dir->dir_list ) >>はC<$dir>と等価です。 このメソッドの意味合いはPerlのCまたはC関数に類似しています;Cから初めてC個の要素を返します。 Cが省略されると、Cからリストの最後までのすべての要素を返します。 Cがマイナスであれば、Cより前方の末尾C<-LENGTH>個の要素を返します。 Cがマイナスであれば、リストの末尾からC個の要素を数えます。 CとCが両方とも省略されると、全体のリストを返します。 スカラコンテキストでは、引数なしのCはディレクトリリストのエントリの個数を返します; Cは個のオフセット位置の要素一つを返します; Cはリストコンテキストで返された要素の最後のものを返します。 =item $fh = $dir->open() C<$dir>を含む与えられた引数すべてをC<< IO::Dir->new >>に渡し、その結果をCオブジェクトとして返します。 openが失敗すると、Cが返されC<$!>がセットされます。 =item $dir->mkpath($verbose, $mode) C<$dir>を含む与えられた引数すべてをC<< File::Path::mkpath() >>に渡し、結果(作成されたすべてのディレクトリ)を返します。 =item $dir->rmtree($verbose, $cautious) C<$dir>を含む与えられた引数すべてをC<< File::Path::rmtree() >>に渡し、結果(削除に成功したファイル数)を返します。 =item $dir->remove() ディレクトリを削除しますが、空であることが必要です。 ディレクトリの削除に成功したか否かを示すboolean(真偽)値を返します。 このメソッドは主に、CのCメソッドとの一貫性のために提供されます。 =item $dir_or_file = $dir->next() ディレクトリのコンテンツ一通りにイテレート(反復)を行うのに便利な方法です。 最初にCが呼ばれると、ディレクトリをCし、ここから最初のアイテムを読み込み、結果をCまたはC(もちろん、実際のタイプがどちらかによります)で返します。 以降のC呼び出しは、ディレクトリ内のコンテンツに対して単に反復され、ディレクトリ内にそれ以上のアイテムがなくなると、未定義値が返されます。 ディレクトリ内の通常ファイルすべてに対してイテレートをする例です: while (my $file = $dir->next) { next unless -f $file; my $fh = $file->open('r') or die "Can't read $file: $!"; ... } ディレクトリを開く際にエラー(例えば存在しないか読み取り不可)が発生すると、CはC<$!>の値とともに例外を投げます。 =item $dir->recurse( callback => sub {...} ) このディレクトリと、全ての子、全ての子の子、etc.に対して反復して、それぞれのエントリに対するCサブルーチンの呼び出しを行います。 これは多くの点でCモジュールが行うことに似ており、もちろんCはCオブジェクト上でもよく動作しますが、Cメソッドにはコールバック・サブルーチンに単なるパス名の文字列ではなくCオブジェクトを送るという利点があります。 Cメソッドは各エントリに対して呼び出されるサブルーチンがCパラメータで指定されることを要求します。 これはCオブジェクトを第一引数として渡されます。 Cはさらに二つの再起処理順をコントロールするbooleanパラメータ、CとCを受け取ることができます。 デフォルトはpreorderで、横型探索、つまりC<< depthfirst => 0, preorder => 1 >>です。 これを書いている時点では、C<< depthfirst => 0, preorder => 0 >>をI<除く>全ての両パラメータの組み合わせがサポートされています。 =item $st = $file->stat() このディレクトリでC<< File::stat::stat() >>を呼び出し、その結果を示すCオブジェクトを返します。 =item $st = $file->lstat() Cと同じですが、C<$file>がシンボリックリンクの時は、Cはリンクの指すファイルの代わりにリンクのstatを行います。 =back =head1 AUTHOR Ken Williams, ken@mathforum.org =head1 SEE ALSO Path::Class, Path::Class::File, File::Spec =head1 DOCUMENT TRANSLATION Makio Tsukamoto, tsukamoto@gmail.com =cut