【PHP8.x】readdir関数の使い方

readdir関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

readdir関数は、ディレクトリハンドルからエントリを読み込む関数です。この関数は、opendir関数で開かれたディレクトリハンドルを引数に取り、そのディレクトリ内の次のファイルまたはディレクトリの名前を返します。readdir関数を使用することで、ディレクトリの内容を順番に取得し、ファイル名やディレクトリ名を処理することができます。

readdir関数は、ディレクトリの終端に達した場合、またはエラーが発生した場合は、falseを返します。そのため、通常はwhileループの中で使用され、返り値がfalseになるまでディレクトリ内のエントリを読み込みます。

readdir関数が返すファイル名には、カレントディレクトリを示す「.」と、親ディレクトリを示す「..」も含まれます。これらの特殊なエントリを処理するかどうかは、アプリケーションの要件に応じて決定する必要があります。

例として、次のコードはディレクトリの内容をリスト表示します。

<?php
$dir = "/path/to/your/directory";
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            echo "filename: " . $file . "<br>";
        }
        closedir($dh);
    }
}
?>

この例では、まずopendir関数でディレクトリを開き、readdir関数でファイル名を順番に取得しています。取得したファイル名をechoで表示し、最後にclosedir関数でディレクトリハンドルを閉じます。readdir関数は、システムエンジニアがディレクトリ内のファイルを操作する際に、基本的な機能を提供する重要な関数の一つです。

構文(syntax)

1<?php
2
3$dir_handle = opendir('/path/to/your/directory');
4
5if ($dir_handle) {
6    while (false !== ($file_name = readdir($dir_handle))) {
7        // ここで $file_name を使った処理を行う
8        echo $file_name . PHP_EOL;
9    }
10    closedir($dir_handle);
11}
12
13?>

引数(parameters)

$dir_handle

  • resource $dir_handle: 読み取るディレクトリへのリソースハンドル

戻り値(return)

string|false

ディレクトリから次のエントリの名前を文字列として返します。エントリがない場合は false を返します。

サンプルコード

readdir と scandir でファイル一覧を取得する

1<?php
2
3/**
4 * ディレクトリ内のファイルをリスト表示する例。
5 * readdir と scandir の比較を行います。
6 */
7
8// readdir を使用した例
9function listFilesReaddir(string $directory): void
10{
11    echo "readdir を使用:\n";
12    if (($handle = opendir($directory)) !== false) {
13        while (($file = readdir($handle)) !== false) {
14            if ($file != "." && $file != "..") { // "." と ".." は現在のディレクトリと親ディレクトリなので除外
15                echo $file . "\n";
16            }
17        }
18        closedir($handle);
19    } else {
20        echo "ディレクトリを開けませんでした。\n";
21    }
22}
23
24// scandir を使用した例
25function listFilesScandir(string $directory): void
26{
27    echo "\nscandir を使用:\n";
28    $files = scandir($directory);
29    if ($files !== false) {
30        foreach ($files as $file) {
31            if ($file != "." && $file != "..") { // "." と ".." は現在のディレクトリと親ディレクトリなので除外
32                echo $file . "\n";
33            }
34        }
35    } else {
36        echo "ディレクトリをスキャンできませんでした。\n";
37    }
38}
39
40// 使用例
41$directory = './'; // 現在のディレクトリ
42listFilesReaddir($directory);
43listFilesScandir($directory);
44
45?>

このサンプルコードは、PHPのreaddir関数とscandir関数を使用して、ディレクトリ内のファイル一覧を取得する方法を比較しています。readdir関数は、ディレクトリハンドル($dir_handle)を引数に取り、ディレクトリ内のファイル名を1つずつ返します。ファイルの読み込みが完了するとfalseを返します。opendir関数でディレクトリを開き、closedir関数で閉じる必要があります。一方、scandir関数は、ディレクトリ名を引数に取り、ディレクトリ内のファイル名(配列形式)を一度に返します。

サンプルコードでは、listFilesReaddir関数とlistFilesScandir関数を定義し、それぞれreaddirscandirを使用してファイル一覧を表示しています。どちらの関数も、.(現在のディレクトリ)と..(親ディレクトリ)を除外しています。readdirを使用する場合は、opendirでディレクトリを開き、readdirでファイル名を1つずつ取得し、closedirでディレクトリを閉じるという手順が必要です。scandirを使用する場合は、scandir関数を呼び出すだけでファイル名の配列を取得できます。

readdir関数は、ディレクトリ内のファイルを順に処理する際に便利ですが、ファイル名の一覧をまとめて取得したい場合は、scandir関数の方が簡潔に記述できます。どちらの関数も、ディレクトリが存在しない場合やアクセス権がない場合は、エラーが発生する可能性があります。エラー処理を適切に行うことが重要です。このサンプルコードは、現在のディレクトリ(./)を対象に、それぞれの関数の使用例を示しています。

readdir関数とscandir関数の比較例ですね。readdirはディレクトリハンドルを引数に取り、ファイル名を一つずつ返します。そのため、opendir関数でディレクトリハンドルを取得し、closedir関数で閉じる必要があります。scandirはディレクトリパスを引数に取り、ファイル名の配列を返します。

どちらの関数も、カレントディレクトリ(.)と親ディレクトリ(..)を返すため、通常はこれらを除外する必要があります。readdirはファイルが見つからない場合にfalseを返すのに対し、scandirはディレクトリのスキャンに失敗した場合にfalseを返します。エラー処理を確実に行いましょう。scandirの方が手軽ですが、メモリ使用量が多い点に注意が必要です。

PHP readdirでディレクトリ内容を順番に読み込む

1<?php
2
3/**
4 * ディレクトリ内のファイルを順番に読み込むサンプルコード
5 */
6function readDirectoryContents(string $directoryPath): void
7{
8    // ディレクトリハンドルをオープン
9    if ($dh = opendir($directoryPath)) {
10        // ファイルを順番に読み込む
11        while (($file = readdir($dh)) !== false) {
12            echo "filename: " . $file . PHP_EOL;
13        }
14        // ディレクトリハンドルをクローズ
15        closedir($dh);
16    } else {
17        echo "ディレクトリを開けませんでした。";
18    }
19}
20
21// サンプルの実行
22$directoryPath = "./"; // 現在のディレクトリ
23readDirectoryContents($directoryPath);
24
25?>

このPHPのサンプルコードは、readdir()関数を使用して、指定されたディレクトリ内のファイルやディレクトリを順番に読み込み、ファイル名を表示するものです。

まず、readDirectoryContents()関数は、引数としてディレクトリのパス($directoryPath)を受け取ります。この関数内で、opendir()関数を使ってディレクトリハンドル($dh)を開きます。opendir()は、ディレクトリを開くことができた場合にディレクトリハンドルを返し、失敗した場合はfalseを返します。

次に、whileループの中でreaddir($dh)関数を使って、ディレクトリハンドルからファイル名またはディレクトリ名を順番に読み込みます。readdir()関数は、成功した場合はファイル名またはディレクトリ名を文字列で返し、ディレクトリの終わりに達した場合、またはエラーが発生した場合はfalseを返します。ループは、readdir()falseを返すまで繰り返されます。読み込まれたファイル名($file)は、echo文を使って表示されます。

最後に、closedir($dh)関数を使ってディレクトリハンドルを閉じ、リソースを解放します。ディレクトリを開くことができなかった場合は、「ディレクトリを開けませんでした。」というエラーメッセージが表示されます。

サンプルコードでは、現在のディレクトリ("./")を指定してreadDirectoryContents()関数を実行し、そのディレクトリ内のファイルとディレクトリを順番に表示しています。readdir()関数は、ディレクトリの内容を特定の順序で返すことを保証していません。

readdir関数を使う際の注意点です。readdirはディレクトリ内のエントリを順番に返しますが、順番はファイルシステムに依存するため、保証されません。ソートが必要な場合は、別途sort関数などを利用してください。.(現在のディレクトリ)と..(親ディレクトリ)も含まれるため、不要な場合は明示的に除外する必要があります。readdirは、読み込みに失敗した場合falseを返すため、厳密等価演算子(!==)でfalseかどうかを判定してください。型が異なる0や空文字列との比較では誤った判定になる可能性があります。また、opendirで開いたディレクトリハンドルは、必ずclosedirで閉じるようにしてください。

関連コンテンツ

【PHP8.x】readdir関数の使い方 | いっしー@Webエンジニア