Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】FilesystemIterator::isDir()メソッドの使い方

isDirメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

isDirメソッドは、FilesystemIteratorクラスのインスタンスが現在指し示しているファイルシステム上の項目が、ディレクトリであるかどうかを判断するメソッドです。FilesystemIteratorクラスは、指定されたディレクトリの内容を一つずつ順番に処理するために使用されるイテレータであり、このisDirメソッドは、そのイテレータが現在位置している項目が「ディレクトリ(フォルダ)」である場合に、真偽値のtrueを返します。

もし現在指し示している項目がディレクトリではなく、通常のファイルやシンボリックリンク、あるいはその他の種類のファイルシステムオブジェクトである場合は、falseを返します。この機能は、ファイルシステムを走査する際に非常に重要です。例えば、あるディレクトリ内の項目を処理する際、それがサブディレクトリであればさらに深く探索する、あるいは特定の処理を行うといった条件分岐を実装する場合に利用されます。

システムエンジニアがファイルシステム操作を行うプログラムを作成する際、ファイルのパスを走査しながら、それぞれの項目がディレクトリなのかファイルなのかを正確に判別する必要がある場面は多々あります。isDirメソッドを使用することで、このような判断を簡単かつ確実に行うことができ、プログラムのロジックをより堅牢に構築することが可能になります。このメソッドは引数を取らず、FilesystemIteratorが保持する現在の要素の状態に基づいて結果を返します。

構文(syntax)

1<?php
2// FilesystemIterator のインスタンスを作成します。
3// 例として、現在のスクリプトがあるディレクトリを対象とします。
4$iterator = new FilesystemIterator(__DIR__);
5
6foreach ($iterator as $fileinfo) {
7    // isDir() メソッドは、現在の項目がディレクトリである場合に true を返します。
8    if ($fileinfo->isDir()) {
9        echo "ディレクトリ: " . $fileinfo->getFilename() . "\n";
10    } else {
11        echo "ファイル: " . $fileinfo->getFilename() . "\n";
12    }
13}

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

指定されたファイルシステムエントリがディレクトリである場合に true を返します。ディレクトリでない場合は false を返します。

サンプルコード

FilesystemIteratorでディレクトリ判定する

1<?php
2
3/**
4 * FilesystemIterator::isDir() の使用例。
5 *
6 * このコードは、FilesystemIterator を用いて指定されたディレクトリ内の要素を走査し、
7 * 各要素がディレクトリであるかどうかを isDir() メソッドで判定する方法を示します。
8 *
9 * 注: PHPの FilesystemIterator クラス自体に isDir() メソッドは定義されていません。
10 *     FilesystemIterator が返す各要素は SplFileInfo オブジェクトであり、
11 *     isDir() はこの SplFileInfo オブジェクトのメソッドです。
12 *     提供されたリファレンス情報が「所属クラス: FilesystemIterator, 名前: isDir」となっているのは、
13 *     FilesystemIterator のコンテキストで、現在の要素に対してディレクトリ判定を行う際に
14 *     このメソッドが使われることを意味すると解釈できます。
15 */
16
17// 1. サンプルコードを実行するためのテスト用ディレクトリとファイルを準備します。
18$testDir = __DIR__ . '/php_is_dir_example_test_dir';
19if (!file_exists($testDir)) {
20    mkdir($testDir); // テスト用のディレクトリを作成
21    echo "テストディレクトリ '{$testDir}' を作成しました。\n";
22}
23
24// テスト用のファイルを作成
25file_put_contents($testDir . '/sample_file.txt', 'これはテストファイルです。');
26echo "ファイル 'sample_file.txt' を作成しました。\n";
27
28// テスト用のサブディレクトリを作成
29$subDir = $testDir . '/sample_subdir';
30if (!file_exists($subDir)) {
31    mkdir($subDir);
32    echo "サブディレクトリ 'sample_subdir' を作成しました。\n";
33}
34file_put_contents($subDir . '/another_file.log', 'これもテストファイルです。');
35echo "ファイル 'sample_subdir/another_file.log' を作成しました。\n";
36
37echo "\n--- ディレクトリの内容を走査し、各要素がディレクトリか判定します ---\n";
38
39try {
40    // 2. FilesystemIterator のインスタンスを作成します。
41    //    指定したディレクトリ ($testDir) 内のファイルやサブディレクトリをイテレートします。
42    //    FilesystemIterator::SKIP_DOTS フラグは、'.' (現在のディレクトリ) と '..' (親ディレクトリ) のエントリをスキップします。
43    $iterator = new FilesystemIterator($testDir, FilesystemIterator::SKIP_DOTS);
44
45    // 3. ループを使ってディレクトリ内の各要素を順に処理します。
46    foreach ($iterator as $fileInfo) {
47        // $fileInfo は現在の要素を表す SplFileInfo オブジェクトです。
48        $name = $fileInfo->getFilename(); // ファイル名またはディレクトリ名を取得します。
49
50        // 4. SplFileInfo オブジェクトの isDir() メソッドを呼び出し、要素がディレクトリかどうかを判定します。
51        if ($fileInfo->isDir()) {
52            echo "  [ディレクトリ] {$name}\n";
53        } else {
54            echo "  [ファイル]     {$name}\n";
55        }
56    }
57
58} catch (UnexpectedValueException $e) {
59    // 指定されたパスが存在しない、またはアクセス権がない場合に発生する可能性があるエラーを処理します。
60    echo "エラー: ディレクトリ '{$testDir}' の読み込みに失敗しました。詳細: " . $e->getMessage() . "\n";
61} finally {
62    // 5. テスト用に作成したディレクトリとファイルをクリーンアップします。
63    echo "\n--- テスト用ディレクトリとファイルをクリーンアップします ---\n";
64    // サブディレクトリ内のファイルを削除
65    if (file_exists($subDir . '/another_file.log')) {
66        unlink($subDir . '/another_file.log');
67    }
68    // サブディレクトリを削除
69    if (file_exists($subDir)) {
70        rmdir($subDir);
71    }
72    // ルートディレクトリ内のファイルを削除
73    if (file_exists($testDir . '/sample_file.txt')) {
74        unlink($testDir . '/sample_file.txt');
75    }
76    // テストディレクトリを削除
77    if (file_exists($testDir)) {
78        rmdir($testDir);
79    }
80    echo "クリーンアップが完了しました。\n";
81}

FilesystemIterator::isDir()は、PHPでファイルシステムを操作する際に、指定された要素がディレクトリであるかどうかを判定するために使用されるメソッドです。厳密には、FilesystemIteratorがディレクトリ内の要素を走査して返すSplFileInfoオブジェクトに対して呼び出されます。このメソッドは引数を一切取らず、戻り値として真偽値(bool)を返します。もし対象の要素がディレクトリであればtrueが返され、ファイルなどのディレクトリ以外の要素であればfalseが返されます。

サンプルコードでは、まずテスト用のディレクトリとファイルを作成し、その後FilesystemIteratorを使ってそのディレクトリ内を順番に調べます。ループ処理の中で各要素はSplFileInfoオブジェクトとして取得され、そのオブジェクトのisDir()メソッドを呼び出すことで、それがディレクトリなのか、それともファイルなのかを簡単に判別しています。この機能は、ディレクトリの構造をプログラムで確認したり、特定の種類のファイルだけを対象に処理を行いたい場合などに非常に役立ちます。

PHPのisDir()メソッドは、リファレンス情報にあるFilesystemIteratorクラスに直接定義されているわけではなく、FilesystemIteratorが返す個々の要素であるSplFileInfoオブジェクトのメソッドです。FilesystemIteratorは指定したディレクトリ内の各ファイルやサブディレクトリをSplFileInfoオブジェクトとして取得し、そのSplFileInfoオブジェクトに対してisDir()を呼び出すことで、それがディレクトリであるかを真偽値で判定できます。パス指定の誤りやアクセス権の問題に備え、try-catchで例外を捕捉し、意図しないエラーで処理が停止しないようにすることが重要です。また、FilesystemIterator::SKIP_DOTSフラグを用いることで、...といった特殊なディレクトリを除外できます。このサンプルコードのように、テスト後に作成したファイルを確実に削除するクリーンアップ処理は、本番環境での不要なファイル生成を防ぐためにも習慣づけることをお勧めします。

FilesystemIterator::isDir()でディレクトリか判定する

1<?php
2
3/**
4 * FilesystemIterator::isDir() メソッドのデモンストレーション。
5 *
6 * 指定されたディレクトリ内の各項目がディレクトリであるかを判定し、その結果を表示します。
7 * システムエンジニアを目指す初心者の方へ:
8 * この関数は、特定のディレクトリの中身を一つずつ調べ、それがファイルなのか、それとも別のディレクトリなのかを判断する方法を示します。
9 * ファイルシステムを扱う際に、どの項目がディレクトリであるかを知ることは非常に重要です。
10 *
11 * @param string $directoryPath 走査するディレクトリのパス。
12 */
13function demonstrateFilesystemIteratorIsDir(string $directoryPath): void
14{
15    // 指定されたパスが有効なディレクトリでない場合は、エラーメッセージを表示して処理を終了します。
16    if (!is_dir($directoryPath)) {
17        echo "エラー: 指定されたパス '{$directoryPath}' は有効なディレクトリではありません。\n";
18        return;
19    }
20
21    echo "ディレクトリ '{$directoryPath}' の内容を走査します。\n";
22    echo "--------------------------------------------------------\n";
23
24    try {
25        // FilesystemIterator を初期化します。
26        // FilesystemIterator::SKIP_DOTS フラグは、特殊なディレクトリを示す '.' (カレントディレクトリ) と '..' (親ディレクトリ) のエントリをスキップします。
27        $iterator = new FilesystemIterator($directoryPath, FilesystemIterator::SKIP_DOTS);
28
29        // ディレクトリ内の各項目をイテレート(繰り返し処理)します。
30        foreach ($iterator as $item) {
31            // isDir() メソッドを使用して、現在の項目がディレクトリであるかを確認します。
32            // 戻り値は bool (true または false) です。
33            if ($item->isDir()) {
34                echo " [DIR ] " . $item->getFilename() . "\n"; // ディレクトリの場合
35            } else {
36                echo " [FILE] " . $item->getFilename() . "\n"; // ファイルの場合
37            }
38        }
39    } catch (UnexpectedValueException $e) {
40        // ディレクトリが見つからない、またはアクセス権がないなどのエラーを捕捉します。
41        echo "エラー: ディレクトリの走査中に問題が発生しました。{$e->getMessage()}\n";
42    }
43
44    echo "--------------------------------------------------------\n";
45}
46
47// --- サンプルコードの実行とテスト環境の準備 ---
48
49// isDir() メソッドの動作を確認するためのテスト用ディレクトリを作成します。
50$testDirectory = __DIR__ . DIRECTORY_SEPARATOR . 'sample_test_dir';
51if (!is_dir($testDirectory)) {
52    mkdir($testDirectory, 0777, true); // ディレクトリが存在しない場合に作成
53}
54
55// テスト用のファイルとサブディレクトリを作成します。
56// これらが demonstrateFilesystemIteratorIsDir 関数でどのように認識されるかを確認します。
57touch($testDirectory . DIRECTORY_SEPARATOR . 'report.pdf');       // ファイルを作成
58touch($testDirectory . DIRECTORY_SEPARATOR . 'image.png');        // ファイルを作成
59mkdir($testDirectory . DIRECTORY_SEPARATOR . 'documents');         // サブディレクトリを作成
60mkdir($testDirectory . DIRECTORY_SEPARATOR . 'photos');            // サブディレクトリを作成
61// サブディレクトリ内にもファイルを作成(FilesystemIteratorは直接は深く潜らないため、このファイルは今回のデモの直接対象外)
62touch($testDirectory . DIRECTORY_SEPARATOR . 'photos' . DIRECTORY_SEPARATOR . 'holiday.jpg');
63
64// demonstrateFilesystemIteratorIsDir 関数を実行し、結果を表示します。
65demonstrateFilesystemIteratorIsDir($testDirectory);
66
67// --- テスト環境の後処理(クリーンアップ)---
68// 作成したファイルとディレクトリを削除し、環境を元の状態に戻します。
69// 注: PHPの rmdir() は空のディレクトリしか削除できません。
70// サブディレクトリ内のファイルやディレクトリを再帰的に削除するには、より複雑なロジックが必要です。
71// この例では、デモンストレーション用に作成した項目のみを明示的に削除します。
72if (is_dir($testDirectory)) {
73    // サブディレクトリ内のファイルを削除
74    if (is_dir($testDirectory . DIRECTORY_SEPARATOR . 'photos')) {
75        unlink($testDirectory . DIRECTORY_SEPARATOR . 'photos' . DIRECTORY_SEPARATOR . 'holiday.jpg');
76        rmdir($testDirectory . DIRECTORY_SEPARATOR . 'photos'); // 空になったサブディレクトリを削除
77    }
78    // 空のサブディレクトリを削除
79    if (is_dir($testDirectory . DIRECTORY_SEPARATOR . 'documents')) {
80        rmdir($testDirectory . DIRECTORY_SEPARATOR . 'documents');
81    }
82    // ファイルを削除
83    unlink($testDirectory . DIRECTORY_SEPARATOR . 'report.pdf');
84    unlink($testDirectory . DIRECTORY_SEPARATOR . 'image.png');
85    // メインのテストディレクトリを削除
86    rmdir($testDirectory);
87}
88
89?>

PHP 8 の FilesystemIterator::isDir() メソッドは、ファイルシステムを走査する際に、現在の項目がディレクトリであるかどうかを判定するために使用されます。このメソッドは FilesystemIterator クラスに属しており、指定したディレクトリ内のファイルやサブディレクトリを一つずつ順番に処理する際に非常に役立ちます。

isDir() メソッドは引数を必要としません。呼び出された FilesystemIterator の現在の項目がディレクトリであれば true を、そうでなければ(例えばファイルであれば) false をブール値として返します。これにより、コード内でファイルとディレクトリを区別し、それぞれ異なる処理を実行することが可能になります。

サンプルコードでは、指定されたディレクトリ内の各項目を FilesystemIterator で繰り返し処理し、isDir() を使ってそれがディレクトリかファイルかを判別して表示しています。ファイルやディレクトリを一覧表示したり、特定の種類の項目だけを処理したりするような場面で、この機能は頻繁に利用されます。システム内でファイルを整理したり、特定の条件でファイルを検索したりする際に、この基本的な判別機能が基盤となります。

FilesystemIteratorは指定されたディレクトリの直下項目を走査し、isDir()メソッドでそれがディレクトリか判定します。FilesystemIteratorの初期化では、特殊な...をスキップするFilesystemIterator::SKIP_DOTSフラグの設定が重要です。ファイルシステム操作では、対象パスの存在確認やアクセス権の有無を事前にチェックし、try-catchで例外処理を行うようにしましょう。後処理でのディレクトリ削除は、rmdir()が空のディレクトリにしか適用できないため注意が必要です。サブディレクトリやファイルが存在する場合は、それらを先に削除する追加の処理が必要になります。

関連コンテンツ