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

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

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

作成日: 更新日:

基本的な使い方

getFilenameメソッドは、PHPのDirectoryIteratorクラスが提供する機能の一つで、現在のイテレータが指すファイルシステムエントリのファイル名を取得するメソッドです。DirectoryIteratorは、指定されたディレクトリのコンテンツ(ファイルやサブディレクトリ)を効率的に反復処理するために使用されるクラスです。このメソッドは、その反復処理中に現在アクセスしているファイルやディレクトリの名前を文字列形式で返します。

例えば、あるディレクトリ内のファイルリストを作成したい場合や、ファイル名に基づいて特定のファイルを検索したり、条件分岐を行ったりする際に、このgetFilenameメソッドが非常に役立ちます。戻り値は、フルパスではなく、あくまでファイルやディレクトリの最終的な名前部分(basename)であり、常に文字列型(string)となります。このメソッドは引数を一切取りません。また、ディレクトリ内の特殊なエントリである「.」(現在のディレクトリ)や「..」(親ディレクトリ)も、その名前として取得されることを理解しておくと良いでしょう。ファイルシステムをプログラムで操作する際に、個々のファイルやディレクトリの名前を正確に把握するための基本的な機能として、初心者の方にも簡単に利用できるでしょう。

構文(syntax)

1<?php
2// 現在のディレクトリにあるファイルとディレクトリのリストを取得するイテレータを作成
3$iterator = new DirectoryIterator(__DIR__);
4
5// イテレータをループし、各項目についてファイル名を取得して表示する
6foreach ($iterator as $fileInfo) {
7    // getFilename() メソッドは、現在の項目(ファイルまたはディレクトリ)の名前を文字列として返します
8    echo $fileInfo->getFilename() . PHP_EOL;
9}
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

DirectoryIterator::getFilename は、現在のディレクトリ内のエントリ(ファイルまたはサブディレクトリ)の名前を文字列で返します。

サンプルコード

PHP DirectoryIteratorでファイル名を取得する

1<?php
2
3/**
4 * 指定されたディレクトリ内の各ファイルおよびディレクトリの名前を取得して表示する関数。
5 * DirectoryIterator クラスと getFilename() メソッドの使用例を示します。
6 *
7 * @param string $directoryPath 処理対象のディレクトリパス。
8 */
9function listDirectoryFileNames(string $directoryPath): void
10{
11    // ディレクトリが存在しないか、読み取り権限がない場合はエラーメッセージを表示
12    if (!is_dir($directoryPath) || !is_readable($directoryPath)) {
13        echo "エラー: 指定されたディレクトリ '{$directoryPath}' が存在しないか、読み取れません。\n";
14        return;
15    }
16
17    echo "ディレクトリ '{$directoryPath}' 内のファイル名:\n";
18
19    try {
20        // DirectoryIterator を作成し、指定されたディレクトリを走査します。
21        // これにより、ディレクトリ内の各エントリ(ファイルやサブディレクトリ)にアクセスできるようになります。
22        $iterator = new DirectoryIterator($directoryPath);
23
24        // ディレクトリ内の各エントリをループ処理します。
25        // $fileInfo は DirectoryIterator のインスタンスとなり、各エントリの情報を含みます。
26        foreach ($iterator as $fileInfo) {
27            // getFilename() メソッドを使用して、現在のエントリの名前を取得します。
28            // これにはファイル名、ディレクトリ名、そして特殊なエントリである '.' (現在のディレクトリ)
29            // と '..' (親ディレクトリ) が含まれます。
30            $fileName = $fileInfo->getFilename();
31
32            // 取得したファイル名を表示します。
33            echo "- " . $fileName . "\n";
34        }
35    } catch (UnexpectedValueException $e) {
36        // 無効なディレクトリパスなどが渡された場合の例外をキャッチし、エラーメッセージを表示します。
37        echo "エラー: ディレクトリの読み込み中に問題が発生しました - " . $e->getMessage() . "\n";
38    }
39}
40
41// --- サンプルコードの実行例 ---
42// このスクリプトを実行する前に、テスト用のディレクトリを作成し、
43// その中にいくつかのファイルやサブディレクトリを作成してみてください。
44//
45// 例1: 現在のスクリプトがあるディレクトリを対象とする
46$currentScriptDirectory = __DIR__;
47listDirectoryFileNames($currentScriptDirectory);
48
49echo "\n"; // 区切りのための改行
50
51// 例2: 存在する特定のディレクトリを対象とする(必要に応じてパスを変更してください)
52// この例では、現在のディレクトリに 'test_data' というディレクトリが存在すると仮定しています。
53// 例: mkdir test_data && touch test_data/document.txt test_data/image.png
54$testDirectory = __DIR__ . '/test_data';
55if (!is_dir($testDirectory)) {
56    // テストディレクトリが存在しない場合は作成(デモンストレーション用)
57    mkdir($testDirectory);
58    file_put_contents($testDirectory . '/example.txt', 'This is a test file.');
59    file_put_contents($testDirectory . '/another_file.log', 'Log entry.');
60    mkdir($testDirectory . '/sub_folder');
61}
62listDirectoryFileNames($testDirectory);
63
64// デモンストレーション後に作成した一時ファイルとディレクトリをクリーンアップ(オプション)
65// 実際のシステムでは、この部分は不要な場合があります。
66if (is_dir($testDirectory)) {
67    // サブフォルダ内のファイルを削除してからサブフォルダを削除
68    if (is_dir($testDirectory . '/sub_folder')) {
69        foreach (glob($testDirectory . '/sub_folder/*') as $item) {
70            unlink($item);
71        }
72        rmdir($testDirectory . '/sub_folder');
73    }
74    // メインディレクトリ内のファイルを削除
75    foreach (glob($testDirectory . '/*') as $item) {
76        if (is_file($item)) {
77            unlink($item);
78        }
79    }
80    rmdir($testDirectory);
81}
82
83?>

PHP 8 の DirectoryIterator::getFilename() メソッドは、ファイルシステム操作において、指定されたディレクトリ内の各ファイルやサブディレクトリの「名前」を取得するために使われます。このメソッドは DirectoryIterator クラスに属しており、ディレクトリの内容を順に走査する際に活用されます。

DirectoryIterator オブジェクトを生成し、そのインスタンスを通じてディレクトリ内の各エントリにアクセスできます。ループ処理で得られる個々のエントリ(ファイルやサブディレクトリ)の情報は DirectoryIterator のインスタンスであり、そのインスタンスに対して getFilename() メソッドを呼び出すことで、そのエントリの名前を文字列として受け取ることが可能です。このメソッドは引数を一切必要としません。戻り値は string 型で、取得されるのは example.txt のようなファイル名や sub_folder のようなディレクトリ名、さらには特殊なエントリである . (現在のディレクトリ) や .. (親ディレクトリ) といった名前そのものです。これにより、ファイル一覧の表示や、特定の名前を持つファイル・ディレクトリの検索など、多様なシナリオでディレクトリ内のエントリを識別し、処理を進めることができます。

このサンプルコードで利用しているgetFilename()メソッドは、ファイルやディレクトリの名前だけでなく、特殊なエントリである . (カレントディレクトリ) や .. (親ディレクトリ) も返します。通常これらは処理対象外となるため、$fileInfo->isDot()などで除外する条件を追加することを検討してください。

また、DirectoryIteratorを使用する際は、指定されたパスが実際にディレクトリであり、かつ読み取り権限があるかをis_dir()is_readable()で事前にチェックすることが重要です。これにより、意図しないエラーやセキュリティリスクを防ぎ、スクリプトの安定性を高めます。

無効なパスが渡された場合にはUnexpectedValueExceptionが発生しうるため、try-catchブロックによる例外処理を適切に記述することで、プログラムの堅牢性が向上します。getFilename()は名前のみを返すため、ファイルのフルパスが必要な場合はgetPathname()などの利用を検討してください。

PHP: DirectoryIteratorでファイル名を取得する

1<?php
2
3/**
4 * 指定されたディレクトリ内の各エントリ(ファイルやサブディレクトリ)の
5 * ファイル名またはディレクトリ名を表示する関数です。
6 * DirectoryIteratorクラスのgetFilenameメソッドを使用します。
7 *
8 * @param string $directoryPath 走査するディレクトリのパス
9 */
10function listFilenamesInDirectory(string $directoryPath): void
11{
12    // ディレクトリが存在しない、または読み取り権限がない場合に備え、
13    // DirectoryIteratorのインスタンス化時に発生する例外を捕捉します。
14    try {
15        // DirectoryIteratorをインスタンス化し、指定されたディレクトリを走査します。
16        // これにより、ディレクトリ内の各エントリにアクセスできるようになります。
17        $iterator = new DirectoryIterator($directoryPath);
18    } catch (UnexpectedValueException $e) {
19        echo "エラー: ディレクトリ '{$directoryPath}' が見つからないか、アクセスできません。\n";
20        return;
21    }
22
23    echo "ディレクトリ '{$directoryPath}' 内のコンテンツ:\n";
24
25    // イテレータをループして、ディレクトリ内の各エントリにアクセスします。
26    foreach ($iterator as $fileInfo) {
27        // getFilename() メソッドは、現在のエントリの名前(ファイル名またはディレクトリ名)を文字列で返します。
28        // これには "." (カレントディレクトリ自身) と ".." (親ディレクトリ) も含まれることに注意してください。
29        $filename = $fileInfo->getFilename();
30        echo "- " . $filename . "\n";
31    }
32}
33
34// --- サンプルコードの実行 ---
35
36// サンプルとして使用する一時的なディレクトリを作成します。
37// 実際のアプリケーションでは、既存のディレクトリパスを指定します。
38$sampleDirectory = 'temp_sample_dir_for_filename';
39if (!is_dir($sampleDirectory)) {
40    mkdir($sampleDirectory);
41    // テスト用のファイルを作成
42    file_put_contents($sampleDirectory . '/document.txt', 'これはテストファイルです。');
43    file_put_contents($sampleDirectory . '/image.jpg', ''); // 空のファイル
44    mkdir($sampleDirectory . '/sub_folder'); // テスト用のサブフォルダ
45}
46
47// 作成した一時ディレクトリ内のファイル名を表示します。
48listFilenamesInDirectory($sampleDirectory);
49
50// --- 後処理(オプション) ---
51// 作成した一時ディレクトリと内容を削除するロジックですが、
52// 初心者が内容を確認しやすいように通常はコメントアウトしておきます。
53/*
54function removeSampleDirectory(string $path): void {
55    if (!is_dir($path)) {
56        return;
57    }
58    $files = array_diff(scandir($path), array('.', '..'));
59    foreach ($files as $file) {
60        (is_dir("$path/$file")) ? removeSampleDirectory("$path/$file") : unlink("$path/$file");
61    }
62    rmdir($path);
63}
64// echo "\nサンプルディレクトリを削除しています...\n";
65// removeSampleDirectory($sampleDirectory);
66// echo "サンプルディレクトリが削除されました。\n";
67*/
68
69?>

PHPのDirectoryIterator::getFilenameメソッドは、指定したディレクトリの中身を一つずつ確認していく際に、現在見ているファイルやフォルダの「名前」を取得するための機能です。このメソッドは、DirectoryIteratorクラスのインスタンスが持っており、ディレクトリをループで走査する際に各エントリの具体的なファイル名やディレクトリ名を知りたいときに使います。

使い方はシンプルで、まずnew DirectoryIterator('ディレクトリパス')でイテレータを作成し、foreachループを使って各エントリに順にアクセスします。ループ内で得られる各エントリのオブジェクト(例: $fileInfo)に対して$fileInfo->getFilename()と呼び出すと、そのエントリの名前が文字列として返されます。

このメソッドは引数を必要とせず、現在のエントリの名前をstring型で戻り値として返します。この戻り値には、実際のファイル名やフォルダ名だけでなく、「.(カレントディレクトリを示す)」や「..(親ディレクトリを示す)」といった特殊なエントリの名前も含まれる点に注意が必要です。サンプルコードでは、指定したディレクトリ内のすべてのコンテンツ名を一覧表示しており、ディレクトリの内容を把握する基本的な処理に活用できます。

DirectoryIteratorを使用する際は、指定したディレクトリが存在しない、またはアクセス権限がない場合に備え、必ずtry-catchブロックで例外処理を記述してください。

getFilename()メソッドは、ファイルまたはディレクトリの「名前」だけを文字列として返します。これはフルパスではなく、パスの最後の要素のみである点に注意が必要です。また、カレントディレクトリを示す「.」と親ディレクトリを示す「..`」という特殊なエントリも結果に含まれます。これらを処理対象から除外したい場合は、別途条件分岐を追加してフィルタリングしてください。

ファイルやディレクトリのフルパスが必要な場合は、DirectoryIteratorが返すSplFileInfoオブジェクトのgetPathname()メソッドなど、別のメソッドの使用を検討してください。

関連コンテンツ