ファイル操作

■ ファイルが存在するか調べる(-e)

◆ ファイルが存在するか調べる

-e などの ファイルテスト演算子 を用いて、ファイルの存在や書き込み可能かなどを調べることができます。-e は Exist の略で、そのファイル(フォルダ)が存在するかどうかを調べます。

if (-e $file) {
    print "ファイルは存在します。\n";
} else {
    print "ファイルは存在しません。\n";
}

■ ファイルかフォルダか調べる(-f, -d)

◆ ファイルかフォルダかを調べる

-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 -o)

◆ アクセス権を調べる

-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)

◆ ファイル名の変更

rename() はファイル名やフォルダ名の変更を行います。失敗時は 0 を、成功時は 0 以外の値を返します。new.txt が既に存在するときは、new.txt が削除され、old.txt が new.txt に変更されます。失敗の原因を知るには、特殊変数 $! を参照します。

if (!rename("old.txt", "new.txt")) {
    print "失敗しました。($!)\n";
}

信頼性の高いプログラムを作成する場合、ファイルへの書き込みを一度テンポラリファイル(一時ファイル)に書き出し、ファイルの生成が成功したのを確認して、ターゲットファイルと置き換える際にも、rename() は使用されます。

■ ファイルをコピー、移動する(copy, move)

◆ コピーと移動

Perl の標準関数ではありませんが、File モジュールを用いることにより、copy() と move() を利用できるようになります。copy(file1, file2) は、file1 の内容を file2 にコピーします。move(file1, file2) は、file1file2 に移動します。プログラムの冒頭で、File::Copy モジュールを読みこんでおく必要があります。

use File::Copy;
copy("fileA.txt", "fileB.txt");    # ファイルをコピー
move("fileC.txt", "fileD.txt");    # ファイルを移動

■ ファイルの更新時刻を変更する(utime)

◆ ファイル更新時刻の変更

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)

◆ ファイル所有者の変更

chown() は UNIX において使用可能です。ファイルの所有者とグループを変更します。第一引数、第二引数には、ユーザID、グループIDを指定します。ファイルは複数指定可能で、関数の戻り値として成功したファイルの個数を返します。

$uid = 1000; $gid = 1000;
if (!chown($uid, $gid, "file.txt")) {
    print "失敗しました。($!)\n";
}
◆ ユーザID、グループIDとは

UNIX においてユーザやグループを識別する数値で、/etc/passwd ファイルにユーザ名とユーザID、/etc/group にグループ名とグループID の対応表が記述されています。

■ ファイルのパーミッションを変更する(chmod)

◆ パーミッションの変更

chmod() はファイルのパーミッションを変更します。例えば、自分が読み書き、他の人が読み込みのみ可能にする場合は 0644 を指定します。chmod() は複数のファイルを指定することも可能で、関数の戻り値として成功したファイルの個数を返します。自分が書き込み権の無いファイルに対して chmod() を行うことはできません。

if (!chmod(0644, "file.txt")) {
    print "失敗しました。($!)\n";
}

■ パーミッションマスクを指定する(umask)

◆ パーミッションマスクの指定

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)

◆ ファイル情報の取得

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)
$inoiノード番号。(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";

Copyright (C) 2002 杜甫々