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

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

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

作成日: 更新日:

基本的な使い方

getFilenameメソッドは、FilesystemIteratorクラスのインスタンスが指し示す現在の要素(ファイルまたはディレクトリ)の名前を取得するために使用するメソッドです。FilesystemIteratorは、ディレクトリ内のファイルやサブディレクトリを一つずつ順番に走査する際に用いられる、PHPの組み込みイテレータの一つです。

このメソッドを呼び出すと、イテレータが現在ポイントしているファイルまたはディレクトリの「ベース名」が文字列として返されます。ここでいうベース名とは、パス情報からディレクトリの階層構造を除いた、純粋なファイル名やディレクトリ名そのものを指します。例えば、イテレータが「/path/to/my_document.txt」というファイルを指している場合、getFilenameメソッドは「my_document.txt」という文字列を返します。

同じFilesystemIteratorクラスには、現在の要素のフルパスを返すgetPathnameメソッドも存在しますが、getFilenameメソッドはファイル名やディレクトリ名だけを必要とする場面で特に有用です。例えば、ファイル一覧をユーザーに表示する際にファイル名だけをリストアップしたい場合や、特定の名前パターンに合致するファイルだけを識別したい場合などに役立ちます。PHP 8においても、このメソッドの基本的な機能と振る舞いは一貫しており、ファイルシステムを効率的に操作するための重要なツールとして利用できます。

構文(syntax)

1<?php
2
3// 作業用の一時ディレクトリを作成します。
4$tempDir = __DIR__ . '/temp_example_dir';
5if (!is_dir($tempDir)) {
6    mkdir($tempDir);
7}
8// テスト用のファイルを作成します。
9file_put_contents($tempDir . '/document.txt', 'これはテストドキュメントです。');
10file_put_contents($tempDir . '/image.jpg', 'これはテスト画像です。');
11
12try {
13    // FilesystemIterator のインスタンスを作成します。
14    // 指定したディレクトリ内のファイルやディレクトリを繰り返し処理できます。
15    $iterator = new FilesystemIterator($tempDir);
16
17    echo "ディレクトリ内のファイル名:\n";
18    foreach ($iterator as $fileInfo) {
19        // FilesystemIterator::getFilename() メソッドを使って、
20        // 現在のイテレータが指しているファイルまたはディレクトリの名前を取得します。
21        echo "- " . $iterator->getFilename() . "\n";
22    }
23
24} catch (Exception $e) {
25    echo "エラーが発生しました: " . $e->getMessage() . "\n";
26} finally {
27    // 例の実行後に作成したファイルとディレクトリをクリーンアップします。
28    if (is_dir($tempDir)) {
29        $files = glob($tempDir . '/*');
30        foreach ($files as $file) {
31            if (is_file($file)) {
32                unlink($file);
33            }
34        }
35        rmdir($tempDir);
36    }
37}
38
39?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

FilesystemIterator::getFilename() は、現在のファイルまたはディレクトリの名前を文字列として返します。

サンプルコード

PHP FilesystemIterator::getFilename()でファイル名を取得する

1<?php
2
3/**
4 * FilesystemIterator::getFilename() メソッドの動作をデモンストレーションします。
5 * 指定されたディレクトリ内の各項目(ファイルやサブディレクトリ)の完全パスとファイル名/ディレクトリ名を表示します。
6 *
7 * システムエンジニアを目指す初心者向けに、`getFilename` が何を返すのかを明確に示すことを目的としています。
8 */
9function demonstrateFilesystemIteratorGetFilename(): void
10{
11    // テスト用のディレクトリパスを定義します。
12    // スクリプトが実行されるディレクトリに一時的なディレクトリを作成します。
13    $testDirPath = __DIR__ . '/temp_fs_iterator_demo';
14
15    // 1. テスト環境の準備
16    // 一時的なディレクトリとファイルを作成し、デモンストレーション用の環境を整えます。
17    if (!is_dir($testDirPath)) {
18        mkdir($testDirPath);
19    }
20    file_put_contents($testDirPath . '/document.txt', 'これはテストファイルです。');
21    file_put_contents($testDirPath . '/image.jpg', 'ダミーコンテンツ');
22    mkdir($testDirPath . '/subdirectory');
23    file_put_contents($testDirPath . '/subdirectory/report.pdf', 'これはレポートです。');
24
25    echo "--- FilesystemIterator::getFilename() デモンストレーション ---\n";
26    echo "対象ディレクトリ: " . $testDirPath . "\n\n";
27
28    try {
29        // 2. FilesystemIterator のインスタンスを作成
30        // FilesystemIterator は、指定されたディレクトリの直下にある項目をイテレート(巡回)するために使用します。
31        // デフォルトでは、カレントディレクトリ(.)と親ディレクトリ(..)はスキップされません。
32        // ここでは、デフォルトの動作で進めます。
33        $iterator = new FilesystemIterator($testDirPath);
34
35        // 3. ループ処理と getFilename() の呼び出し
36        // ディレクトリ内の各項目(ファイルやサブディレクトリ)を一つずつ処理します。
37        foreach ($iterator as $fileInfo) {
38            // $fileInfo は SplFileInfo クラスのインスタンスです。
39            // FilesystemIterator は SplFileInfo オブジェクトを返します。
40
41            // getPathname() は、ファイルまたはディレクトリへの完全なパスを返します。
42            $fullPath = $fileInfo->getPathname();
43
44            // getFilename() は、パスからファイル名またはディレクトリ名のみを返します。
45            // 例: "/path/to/file.txt" から "file.txt" を返します。
46            // 例: "/path/to/directory/" から "directory" を返します。
47            $filename = $fileInfo->getFilename();
48
49            echo "完全パス: " . $fullPath . "\n";
50            echo "ファイル名/ディレクトリ名: " . $filename . "\n";
51            echo "-----------------------------------\n";
52        }
53    } catch (UnexpectedValueException $e) {
54        // FilesystemIteratorのコンストラクタが失敗した場合(例: 指定されたパスが存在しないかディレクトリではない場合)に捕捉します。
55        echo "エラーが発生しました: " . $e->getMessage() . "\n";
56    } finally {
57        // 4. テスト環境のクリーンアップ
58        // 作成した一時的なディレクトリとファイルを削除し、元の状態に戻します。
59        // この処理は、スクリプトが正常に終了してもエラーで終了しても実行されます。
60        if (is_dir($testDirPath)) {
61            // RecursiveDirectoryIterator を使ってサブディレクトリ内のファイルも削除します。
62            $ri = new RecursiveIteratorIterator(
63                new RecursiveDirectoryIterator($testDirPath, RecursiveDirectoryIterator::SKIP_DOTS),
64                RecursiveIteratorIterator::CHILD_FIRST
65            );
66            foreach ($ri as $item) {
67                if ($item->isDir()) {
68                    rmdir($item->getPathname());
69                } else {
70                    unlink($item->getPathname());
71                }
72            }
73            rmdir($testDirPath); // ルートディレクトリを削除
74            echo "\nテスト環境「" . $testDirPath . "」をクリーンアップしました。\n";
75        }
76    }
77}
78
79// デモンストレーション関数の実行
80demonstrateFilesystemIteratorGetFilename();
81
82?>

PHPのFilesystemIterator::getFilename()メソッドは、ファイルシステムを操作する際に、パスからファイル名やディレクトリ名だけを取得するために使用されます。このメソッドは、FilesystemIteratorが返すSplFileInfoクラスのインスタンスから呼び出されます。FilesystemIteratorは、指定されたディレクトリ内のファイルやサブディレクトリといった各項目を順番に処理するための機能を提供します。

getFilename()メソッドは引数を一切取りません。その役割は、ファイルまたはディレクトリの完全なパスから、その最後の部分である「名前」のみを文字列として返すことです。例えば、「/path/to/document.txt」という完全なパスからは「document.txt」を、また「/path/to/subdirectory/」というディレクトリのパスからは「subdirectory」を返します。

このサンプルコードでは、まず一時的なディレクトリと複数のテストファイル、サブディレクトリを作成し、デモンストレーション環境を整えています。次に、FilesystemIteratorを使ってその一時ディレクトリ内を巡回し、各項目についてgetPathname()メソッドで完全なパスを取得し、それと並行してgetFilename()メソッドで抽出されたファイル名やディレクトリ名を表示しています。これにより、完全なパスからファイルやディレクトリの名前部分だけがどのように正確に取得されるかを、システムエンジニアを目指す初心者の方にも分かりやすく示しています。ファイル操作において、パス全体ではなく名前部分だけが必要な場面で非常に役立つメソッドです。

FilesystemIterator::getFilename()は、ファイルやディレクトリの完全パスではなく、名前部分のみを文字列で返します。これはFilesystemIteratorが返すSplFileInfoオブジェクトから呼び出します。FilesystemIteratorは指定ディレクトリ直下の項目のみを処理するため、サブディレクトリ内も処理するならRecursiveDirectoryIteratorなどを検討してください。ディレクトリ不存在などのエラーに備え、try-catchで適切に例外を捕捉し、安全なコードにすることが重要です。

関連コンテンツ