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

リストを二つ読込んだところで先頭に戻しています。

ページのトップへ戻る