§8.6 ファイル操作いろいろ


作成日:2001/09/09(日)

前節ではstat関数を使って、ファイルに関するさまざまな情報を入手する方法を紹介しました。 この節ではファイルの追加と削除、コピー、ファイル名の変更といった、いろいろなファイル操作についてお話します。

ファイルの追加と削除

ファイルの追加に関してはすでに「§8.1 ファイルのオープンとクローズ」でお話しましたが、ファイル名を指定して上書きモードでオープンします。

 open(OUT, ">new.txt")
   or die "Can't opened!";
 close(OUT);

上のようにすると空のファイルnew.txtが作成されます。

次にファイルを削除するにはPerlの組込み関数unlinkを使います。

 unlink ("iranai.txt");

上のように削除したいファイル名をダブルクォートで囲んで書くと、そのファイルが削除されます。 複数のファイルを削除したい場合はリストにしてunlink関数に渡します。

 unlink("iranai1.txt", "iranai2.txt", "iranai3.txt");

カレントディレクトリにある全てのファイルを削除したい、あるいは拡張子.txtのファイルだけを全部削除したいというような場合がありますね。 こんなときはファイル名グロブ演算子<>を使います。

 unlink<*>;
 #カレントディレクトリにある全ファイルを削除

 unlink<*.txt>;
 #カレントディレクトリにある拡張子.txtの
 #ファイルを全部削除

<>は第6章や、この章のはじめの方で紹介した行入力演算子と全く同じです。 ですがPerlは、<>の間にファイルハンドルやスカラー変数以外の物(例えばスペースやピリオド)があると自動的にファイル名グロブ演算子だと判断します。

ファイル名グロブ演算子は、指定されたディレクトリの中でパターンマッチを行い、マッチしたファイル名を返します。 *(アスタリスク)はワイルドカードマッチ(なんでもマッチ)をします。 このファイル名グロブ演算子のアスタリスクと、第7章で紹介した正規表現のアスタリスクとは全く別の意味です。 またファイル名グロブ演算子の中では正規表現は使えませんので注意が必要です。

<$file>のように、ファイル名グロブ演算子の中でどうしてもスカラー変数を使いたいときはどうすればいいでしょうか? Perlはこのようなときのためにglob($file)という書き方を用意してくれています。

 unlink glob($file);

glob( )はスカラー変数に対してだけでなく通常の場合にも使えます。

 unlink glob("iranai.txt");

ファイルのコピー

次のファイル操作はファイルのコピーです。 といっても、Perlにはファイルコピーのための関数はありません。 でも今までみてきたことを使えば、簡単なファイルコピーのためのスクリプトが書けます。

 die "kaki.dat exists already!!\n" if(-e "kaki.dat");
 die "yomi.dat doesn't exist.\n" unless(-e "yomi.dat");
 open(IN, "yomi.dat")
   or die "yomi.dat can't open!!\n";
 open(OUT, ">kaki.dat")
   or die "kaki.dat can't open!!\n";
 while(<IN>){
   print OUT $_;
 }
 close(IN);
 close(OUT);

今までの復習もかねて、上のスクリプトがなぜファイルコピーをするのかを考えてみてください。 なお、File::Copyモジュールを使うともっと簡単に出来ます。 モジュールやその使い方については後の章で紹介します。

ファイル名の変更

ファイル名を変更するにはrename関数を使います。

 rename("old.txt", "new.txt");

上のようにするとold.txtの名前がnew.txtに変更されます。 ファイル名を変更すると同時にディレクトリを移動したい場合は、そのパスを書けばいいのですが、UNIXではそのようなことが出来ない場合もあります。 また前に紹介したFile::Copyモジュールを使うことも出来ます。

この節ではファイル操作に関する基本的な部分を見てきました。 次の節ではパーミッションについてお話します。


「§8.5 ファイル情報の取得」へ 「§8.7 パーミッション」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp