Perl入門 ≫ LESSON21 ディレクトリアクセス
ディレクトリ関数
Perlでは、ファイルへのアクセス同様、ディレクトリにもアクセスできる関数が揃っています。
●opendir:ディレクトリのオープン
opendir ディレクトリハンドル, ディレクトリ名
ディレクトリをオープンし、指定したディレクトリハンドルと関連付けます。
このディレクトリハンドルを使用してオープンしたディレクトリへのアクセスを行います。
ディレクトリハンドルは変数名と同じく自分で自由に付けます。
opendir関数は、オープンに成功すると真を、失敗すると偽を返します。
#ディレクトリオープン
opendir(DIR, "testdir") || die "Directory open error!";
while(my $v = readdir(DIR)) {
print "$v\n";
}
closedir(DIR);
.←カレントディレクトリ
..
←すぐ上のディレクトリ
file1.txt
file2.txt
●closedir:ディレクトリクローズ
closedir ディレクトリハンドル
指定されたディレクトリハンドルをクローズします。
クローズすると、以後そのファイルハンドルを使ってアクセスはできません。
(同じディレクトリハンドル名で新たにopendirすることは出来ます。)
opendirが成功した場合の処理で、必ずclosedirを忘れずに書いて下さい。
●readdir:読み込み
readdir ディレクトリハンドル
ディレクトリの中にある要素(ファイル・ディレクトリ名)を返します。
要素がなくなるとundefを返し、要素はディレクトリ内での名前で、フルパス名ではありません。
ディレクトリ一覧を読込むと、ファイル名・ディレクトリ名の他にカレントディレクトリを表す”.”と、直上のディレクトリ(親ディレクトリ)を表す”..”も読込まれます。
●telldir:位置を返す
telldir ディレクトリハンドル
ディレクトリ内の位置を返します。 この値はシステムによるので、実行するごとに値は変化します。
opendir(DIR, "testdir") || die "Directory open error!";
while(my $v = readdir(DIR)) {
my $pos = telldir(DIR);
print "$pos : $v\n";
}
closedir(DIR);
13351138 : .
13351141 : ..
13351151 : file1.txt
13351160 : file2.txt
0 : file3.txt
●seekdir:位置移動
seekdir ディレクトリハンドル, 位置
ディレクトリ内のreaddirの位置を設定します。位置の値は、telldirによって返されるファイルオフセットになります。
opendir(DIR, "testdir") || die "Directory open error!";
my $filepos = 0;
my $pos = 0;
my $v = "";
while($v = readdir(DIR)) {
$pos = telldir(DIR);
print "$pos : $v\n";
if($v eq "file1.txt") { $filepos = $pos; }
}
#ファイルfile1.txtの位置に移動。
seekdir(DIR, $filepos);
while($v = readdir(DIR)) {
$pos = telldir(DIR);
print "$pos : $v\n";
}
closedir(DIR);
これを実行してみると、ファイルfile1.txtから後のリストをもう一度表示します。
●rewinddir:先頭に戻す
rewinddir ディレクトリハンドル
ディレクトリ内の読み位置を先頭に戻します。
opendir(DIR, "testdir") || die "Directory open error!";
my $i = 0;
while(my $v = readdir(DIR)) {
$i++;
my $pos = telldir(DIR);
print "$pos : $v\n";
if($i == 2) { last; }
}
#先頭に移動。
rewinddir(DIR);
while(my $v = readdir(DIR)) {
my $pos = telldir(DIR);
print " $pos : $v\n";
}
closedir(DIR);
リストを二つ読込んだところで先頭に戻しています。