-e などの ファイルテスト演算子 を用いて、ファイルの存在や書き込み可能かなどを調べることができます。-e は Exist の略で、そのファイル(フォルダ)が存在するかどうかを調べます。
if (-e $file) { print "ファイルは存在します。\n"; } else { print "ファイルは存在しません。\n"; }
-f は、指定したファイルが通常のファイルかどうかを調べます。-d はファイルがフォルダ(ディレクトリ)かを調べます。-f や -d の他にも -l(シンボリックリンク)、-p(名前付きパイプ)、-S(ソケット)など、UNIX 依存のファイルタイプ用の演算子も用意されています。
if (-f $file) { print "通常ファイルです。\n"; } else { print "通常ファイルではありません。\n"; } if (-d $file) { print "フォルダ(ディレクトリ)です。\n"; } else { print "フォルダ(ディレクトリ)ではありません。\n"; }
-r、-w、-x はそれぞれ、指定したファイルやフォルダが読み(Read)こみ可能か、書き込み(Write)可能か、実行(eXecute)可能かどうかを調べます。指定したファイルがフォルダの場合は、-e はそのフォルダに移動可能かどうかを調べます。他に、ファイルの所有者が自分自身かどうかを調べる -o もあります。
if (-r $file) { print "読み込みできます。\n"; } if (-w $file) { print "書き込みできます。\n"; } if (-x $file) { print "実行できます。\n"; } if (-o $file) { print "所有者は私です。\n"; }
unlink() は指定したファイルを削除します。複数のファイルを指定可能で、削除に成功したファイルの個数を返します。すべてのファイルの削除に失敗した場合は 0 を返します。失敗の原因を知るには、特殊変数 $! を参照します。
if (unlink($file) == 0) { print "失敗しました。($!)\n"; }
フォルダを削除する場合は「フォルダを削除する」を参照してください。
rename() はファイル名やフォルダ名の変更を行います。失敗時は 0 を、成功時は 0 以外の値を返します。new.txt が既に存在するときは、new.txt が削除され、old.txt が new.txt に変更されます。失敗の原因を知るには、特殊変数 $! を参照します。
if (!rename("old.txt", "new.txt")) { print "失敗しました。($!)\n"; }
信頼性の高いプログラムを作成する場合、ファイルへの書き込みを一度テンポラリファイル(一時ファイル)に書き出し、ファイルの生成が成功したのを確認して、ターゲットファイルと置き換える際にも、rename() は使用されます。
Perl の標準関数ではありませんが、File モジュールを用いることにより、copy() と move() を利用できるようになります。copy(file1, file2) は、file1 の内容を file2 にコピーします。move(file1, file2) は、file1 を file2 に移動します。プログラムの冒頭で、File::Copy モジュールを読みこんでおく必要があります。
use File::Copy; copy("fileA.txt", "fileB.txt"); # ファイルをコピー move("fileC.txt", "fileD.txt"); # ファイルを移動
utime() はファイルの最終アクセス時刻と最終更新時刻を変更します。時刻変更に成功したファイルの個数を返します。時刻は timelocal() などを用いて求めます。
use Time::Local; $year = 1999; $mon = 12; $mday = 31; $hour = 11; $min = 30; $sec = 00; $tt = timelocal($sec, $min, $hour, $mday, $mon - 1, $year - 1900); utime($tt, $tt, "data.txt");
chown() は UNIX において使用可能です。ファイルの所有者とグループを変更します。第一引数、第二引数には、ユーザID、グループIDを指定します。ファイルは複数指定可能で、関数の戻り値として成功したファイルの個数を返します。
$uid = 1000; $gid = 1000; if (!chown($uid, $gid, "file.txt")) { print "失敗しました。($!)\n"; }
UNIX においてユーザやグループを識別する数値で、/etc/passwd ファイルにユーザ名とユーザID、/etc/group にグループ名とグループID の対応表が記述されています。
chmod() はファイルのパーミッションを変更します。例えば、自分が読み書き、他の人が読み込みのみ可能にする場合は 0644 を指定します。chmod() は複数のファイルを指定することも可能で、関数の戻り値として成功したファイルの個数を返します。自分が書き込み権の無いファイルに対して chmod() を行うことはできません。
if (!chmod(0644, "file.txt")) { print "失敗しました。($!)\n"; }
umask() は、プロセスの属性である umask を参照・変更します。umask は、新しく作成するファイルやフォルダのパーミッションに制限をかけるためのマスク値です。通常、新しく作成するファイルのパーミッションは 0666、フォルダのパーミッションは 0777 となりますが、umask が 0022 の時は、ファイルが 0666-0022=0644、フォルダが 0777-0022=0755 となります。
printf("%03o\n", umask()); # 現在のマスクを表示 umask(0077); # マスクを変更 open(FILE, "> file.txt"); print FILE "xxx\n"; close(FILE);
上記の例では、umask に 0077 を指定していますので、作成されるファイルのパーミッションは 0600 になります。umask の初期値は通常 0022 であることが多いようです。
stat() や lstat() は、ファイルに関する様々な情報を得ます。
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); open(IN, $filename); ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = lstat(IN); close(IN);
それぞれの値は次の意味を持ちます。(UNIX)は主に UNIX 系 OS で使用される値であることを示します。時刻を年月日時分秒に変換するには localtime() を用います。
値 | 説明 |
---|---|
$dev | デバイス番号。(UNIX) |
$ino | iノード番号。(UNIX) |
$mode | モード(パーミッション)。 |
$nlink | リンク数。(UNIX) |
$uid | ユーザID。(UNIX) |
$gid | グループID。(UNIX) |
$rdev | デバイス識別子。(UNIX) |
$size | ファイルサイズ。バイト単位。 |
$atime | 最終アクセス時刻。 |
$mtime | 最終更新時刻。 |
$ctime | 作成時刻。 |
$blksize | ブロックサイズ。(UNIX) |
$blocks | ブロック数。(UNIX) |
これは UNIX 依存の機能です。link(old, new) は、old のリンクファイル(ハードリンクファイル)new を作成します。
if (!link("/tmp/old.txt", "/tmp/new.txt")) { print "失敗しました。($!)\n"; }
例えば上記の例を実行すると、/tmp/old.txt という名前のファイルが、/tmp/new.txt という別の名前も持つようになります。両者は2つのファイルに見えますが、実態はひとつのファイルです。UNIX 系 OS でのみサポートされています。ディレクトリ(フォルダ)に対するハードリンクファイルを作成することはできません。また、ファイルシステムをまたがってハードリンクファイルを作成することはできません。
これは UNIX 依存の機能です。symlink(old, new) は、old を参照するシンボリックリンクファイル new を作成します。old はディレクトリ(フォルダ)でも構いません。シンボリックリンクファイルは、Windows のショートカットファイルに相当します。readlink(new) は、シンボリックリンクファイル new がどのファイルを参照しているかを返します。
if (!symlink("/tmp/old.txt", "/tmp/new.txt")) { print "失敗しました。($!)\n"; } $link = readlink("/tmp/new.txt"); print "link = $link\n";