§8.4 ファイルテスト


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

前節でファイルオープンエラーの処理を紹介しました。 存在しないファイルを開こうとしてしまったり、ないと思っていたファイルが実は存在していて、上書きモードで書きこんでしまったために、前のデータが消えてしまったなんていう悲劇は避けたいですよね。 そこでこの節ではファイルテストについてお話します。

ファイルが存在するかどうかのテスト

ファイルが存在するかどうかをテストするには-e演算子を使います。 -e演算子はファイルが存在すれば真を、存在しなければ偽を返します。

 if(-e "can.dat"){
   print "This file exists.\n";
 } else {
   print "This file doesn't exist.\n";
 }

読みこみ/書き込み可能かテストする

次にファイルが読み込み可能かをテストするには-r演算子を使います。 次のスクリプトはファイルが読みこみ可能ならばファイルをオープンし、読みこみ不可ならば"いや〜ん、読まないで!!"と表示します。

 if(-r "can.dat"){
   open(IN, "can.dat");
 } else {
   print "いや〜ん、読まないで!!\n";
 }

またファイルが書き込み可能かをチェックするには-w演算子を使います。

 if(-w "can.dat"){
   open(OUT, ">can.dat");
 } else {
   print "いや〜ん、書かないで!!\n";
 }

上のスクリプトで実際に"いや〜ん、書かないで!!"と表示させるには、can.datを作り(中身はなんでもかまいません)、そのアイコンを右クリックして「プロパティ」を選択、ウィンドウの一番下にある属性タブの「読み出し専用」のチェックボックスをオンにしてからスクリプトを実行します。 ぜひ1度お試しあれ。

次の表は、Perlで使えるファイルテスト演算子の一覧です。 いろいろな演算子について実験してみてください。

演算子 処理
-r ファイルが読みこみ可能か?
-w ファイルが書きこみ可能か?
-x ファイルが実行可能か?
-o ファイルがユーザ所有か?
-R 実ユーザがファイルを読みこみ可能か?
-W 実ユーザがファイルに書きこみ可能か?
-X 実ユーザがファイルを実行可能か?
-O ファイルが実ユーザ所有か?
-e ファイルが存在するか?
-z ファイルサイズが0か?
-s ファイルサイズが0でないか?
-f ファイルが普通のファイルか?
-d ファイルがディレクトリか?
-l ファイルがシンボリックリンクか?
-S ファイルがソケットか?
-p ファイルが名前つきパイプか?
-b ファイルがブロック特殊ファイルか?
-c ファイルが文字特殊ファイルか?
-u ファイルがsetuidされているか?
-g ファイルがsetgidされているか?
-k ファイルのstickyビットが
設定されているか?
-t ファイルハンドルに対する
isatty()がオンか?
-T ファイルがテキストファイルか?
-B ファイルがバイナリファイルか?
-M 修正日からの日数
-A アクセス日からの日数
-C inode修正日からの日数

次にいくつかの使用例を紹介します。 まずは-s演算子です。

 $size = -s "can.dat";
 print "can.dat のファイルサイズは$sizeバイトです。\n";

-s演算子はテストしたファイルのサイズをバイト数で返します。 次は-M、-A演算子です。 -M演算子は最終更新日からの日数を、-A演算子は最終アクセス日からの日数を、それぞれ日単位で返します。

 $mod = -M "can.dat";
 print "can.datは修正されてから$mod日たちます。\n";
 $acc = -A _;
 print "can.datはアクセスされてから$acc日たちます。\n";

上のスクリプトの3行目をみてください。 -A演算子に対してアンダースコア(_)だけを渡しています。 ファイルテスト演算子の引数をこのように書くと、直前にファイルテストしたファイル名が渡されます。 ですから今の場合、-M演算子に渡されたcan.datが-A演算子にも渡されるのです。

この節ではファイルテストについてお話してきました。 次の節ではファイルの詳細な情報を得るための方法について紹介します。


「§8.3 ファイルオープンエラー処理」へ 「§8.5 ファイル情報の取得」へ
ソフトバンク パブリッシング株式会社

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