Translate

2008年8月24日日曜日

File::Pathモジュール

ディレクトリを追加したり(mkdir関数)、ディレクトリを削除(rmdir関数)
していてふと思ったのだけど、rmdir関数だとディレクトリの中身が
空じゃないと削除してくれないんですね。

そんなわけで、削除したいディレクトリにファイルがある場合は
ディレクトリ内を削除してからフォルダを削除しないといけない
わけですが、非常にめんどい。
てか、車輪が標準装備されてるんだから使いましょう。
って話。

という流れで登場するのが、File::Pathモジュール。
やってくれることは、階層を持ったディレクトリの作成や
rm -rfコマンドのごとく指定したディレクトリにファイルが
あってもモジュール側で削除してくれます。

で、CPANに飛んでいきまずは、SYNOPSISをコピペで動かしみよう~
File::Path(Ver 2.04)

と、思ったらうまくいかないのですよ…
で、よくよく見たらmodernとtraditionalに別れてるわけで
自分のPCや、レンタル鯖のFile::Pathのバージョンを調べてみると
Ver1.08なわけです。
で、ひょっとしてってことで
perldoc -m File::Path
で、Ver1.08のPODを眺めてみるとサポートしてるのは、
Ver2.04で書いてあったtraditionalの方の書き方だったので
ひとまず、そちらで書いたら動いてくれました。


という前置きをしてから。
カレントディレクトリに./a/b/cと言ったディレクトリを作りたければ
use strict;
use warnings;
use File::Path;

#modern
mkpath( './a/b/c', {verbose => 0, mode => 0755} );

#traditional
mkpath( ['./a/b/c'], 0, 0755)

(※modernをサポートしてるかは、各自確認してみてください。)

引数についてですが、
2番目の引数をtrueになるように何か与えると
生成したフォルダの情報を吐き出します。
↓こんな感じ
mkdir ./a
mkdir ./a/b
mkdir ./a/b/c

勿論、既にフォルダが存在していた場合は何もしません。

3番目の引数は、パーミッションの設定です。
何もセットしない場合は、ディフォルトで0777がセットされるようです。


削除に関しても同じです。
カレントディレクトリに./a/b/cという構成のディレクトリがあったとして…
use strict;
use warnings;
use File::Path;

#modern
rmtree( './a' );

#traditional
rmtree( ['./a'] )


これで、削除ができますね。

おまけ。
winで、ppmから最新のFile::Pathを探してみたのだけど
最新を含んだリポジトリが見当たらなかったんで、
perl -MCPAN -e shell で
install File::Path で
さっくり入ってくれました。
ver2.04だと他にも引数が用意されていますね。

0 件のコメント: