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

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

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

作成日: 更新日:

基本的な使い方

getBasenameメソッドは、DirectoryIteratorクラスで現在扱っているファイルまたはディレクトリのエントリから、その基本名(basename)を取得するメソッドです。このメソッドは、フルパスからディレクトリ部分を除いたファイル名やディレクトリ名のみを抽出します。例えば、/path/to/document.txtというエントリに適用すると、返り値はdocument.txtとなります。

getBasenameメソッドには、オプションとして$suffixという文字列型の引数を指定できます。この引数に除去したい拡張子などの文字列を指定することで、その部分を除いた基本名を取得することが可能です。具体的には、document.txtに対して$suffix.txtを指定すると、返り値はdocumentとなります。これにより、拡張子を含まない純粋なファイル名を簡単に扱えます。

この機能は、ディレクトリ内のファイル一覧から名前だけを抜き出したい場合や、拡張子を除いた名前でファイルを処理したい場合など、システム開発におけるファイル管理の基本的な場面で幅広く活用されます。

構文(syntax)

1<?php
2$directory = new DirectoryIterator('.');
3echo $directory->getBasename();
4?>

引数(parameters)

?string $suffix = null

  • ?string $suffix = null: 取得するベース名から除外する接尾辞(サフィックス)を指定します。指定しない場合は、ファイル名またはディレクトリ名のみが返されます。

戻り値(return)

string

DirectoryIterator::getBasename は、現在のディレクトリ要素のファイル名またはディレクトリ名(拡張子なし)を文字列として返します。

サンプルコード

DirectoryIterator::getBasename() でファイル名を取得する

1<?php
2
3// このサンプルコードは、DirectoryIterator クラスの getBasename メソッドの使用方法を示します。
4// getBasename は、ファイルまたはディレクトリの名前部分を取得し、オプションで指定したサフィックスを削除できます。
5
6// 1. テスト用の作業ディレクトリとファイルを作成します
7$testDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'getbasename_example_' . uniqid();
8if (!mkdir($testDir) && !is_dir($testDir)) {
9    echo "エラー: テストディレクトリを作成できませんでした。\n";
10    exit(1);
11}
12
13file_put_contents($testDir . DIRECTORY_SEPARATOR . 'document.txt', 'テキスト');
14file_put_contents($testDir . DIRECTORY_SEPARATOR . 'image.jpg', '画像');
15file_put_contents($testDir . DIRECTORY_SEPARATOR . 'report.pdf', 'レポート');
16file_put_contents($testDir . DIRECTORY_SEPARATOR . 'archive.tar.gz', 'アーカイブ');
17// サブディレクトリも作成(中身は空)
18mkdir($testDir . DIRECTORY_SEPARATOR . 'sub_folder');
19
20echo "テストディレクトリ: " . $testDir . "\n\n";
21
22// 2. DirectoryIterator を使用してディレクトリを走査し、各エントリのベース名を表示します
23echo "--- DirectoryIterator::getBasename() の使用例 ---\n";
24
25try {
26    $iterator = new DirectoryIterator($testDir);
27
28    foreach ($iterator as $fileinfo) {
29        // '.' と '..' (現在のディレクトリと親ディレクトリ) はスキップします
30        if ($fileinfo->isDot()) {
31            continue;
32        }
33
34        echo "元のファイル名/ディレクトリ名: " . $fileinfo->getFilename() . "\n";
35
36        // 引数なしの場合、完全なベース名が返されます
37        echo "  - getBasename() (サフィックスなし): " . $fileinfo->getBasename() . "\n";
38
39        // 引数 $suffix を指定して、ファイル名からその部分を削除します
40        // 指定したサフィックスがファイル名末尾と一致する場合にのみ削除されます
41        if ($fileinfo->isFile()) {
42            if ($fileinfo->getExtension() === 'txt') {
43                echo "  - getBasename('.txt') ('.txt'削除): " . $fileinfo->getBasename('.txt') . "\n";
44            } elseif ($fileinfo->getExtension() === 'jpg') {
45                echo "  - getBasename('.jpg') ('.jpg'削除): " . $fileinfo->getBasename('.jpg') . "\n";
46            } elseif ($fileinfo->getFilename() === 'archive.tar.gz') {
47                // 複数の拡張子がある場合
48                echo "  - getBasename('.gz') ('.gz'削除): " . $fileinfo->getBasename('.gz') . "\n";
49                echo "  - getBasename('.tar.gz') ('.tar.gz'削除): " . $fileinfo->getBasename('.tar.gz') . "\n";
50            }
51        }
52        echo "\n";
53    }
54} catch (UnexpectedValueException $e) {
55    echo "エラー: 指定されたディレクトリが存在しないか、アクセスできません。" . $e->getMessage() . "\n";
56} finally {
57    // 3. テスト用に作成したディレクトリとファイルをクリーンアップします
58    echo "--- クリーンアップ中 ---\n";
59    foreach (new DirectoryIterator($testDir) as $fileinfo) {
60        if ($fileinfo->isDot()) {
61            continue;
62        }
63        $path = $fileinfo->getPathname();
64        if ($fileinfo->isFile()) {
65            unlink($path);
66        } elseif ($fileinfo->isDir()) {
67            rmdir($path); // 空のディレクトリを削除
68        }
69    }
70    rmdir($testDir); // メインのテストディレクトリを削除
71    echo "テストディレクトリをクリーンアップしました: " . $testDir . "\n";
72}
73
74?>

PHP 8のDirectoryIteratorクラスが提供するgetBasenameメソッドは、ファイルやディレクトリのパスから、拡張子を含む「名前の部分」だけを抽出するために使用されます。これは、ファイルパス全体からディレクトリ部分を取り除いた名前、いわゆるベース名を取得する際に特に便利です。

このメソッドは、オプションで$suffixという文字列型の引数を一つ受け取ります。$suffixを省略するかnullを指定した場合、ファイルやディレクトリの完全なベース名がそのまま文字列として返されます。例えば、「document.txt」というファイル名であれば「document.txt」が、また「sub_folder」というディレクトリ名であれば「sub_folder」が戻り値となります。

もし$suffixに特定の文字列を指定すると、その文字列がファイル名の末尾と完全に一致した場合にのみ、その部分が削除されたベース名が文字列として返されます。これにより、「document.txt」から「.txt」を削除して「document」だけを取得したり、「archive.tar.gz」から「.gz」や「.tar.gz」といった拡張子部分を削除して、ファイルの種類に応じた処理を行うことが可能になります。

サンプルコードでは、一時ディレクトリ内に様々な種類のファイルやサブディレクトリを作成し、DirectoryIteratorを使ってこれらを一つずつ走査しています。各項目に対してgetBasenameメソッドを引数なしで呼び出した場合と、特定の拡張子(サフィックス)を引数に指定した場合の結果を比較して表示しており、メソッドの具体的な挙動が視覚的に理解できるようになっています。これにより、システムエンジニアを目指す初心者がファイル名の適切な処理方法を学ぶ上で役立ちます。

getBasename()は、ファイルやディレクトリのパスから名前部分のみを取得するメソッドです。オプション引数$suffixを指定すると、その文字列がファイル名の末尾と完全に一致する場合に限り、その部分が削除されますのでご注意ください。例えば「.tar.gz」のような複数の拡張子を持つファイルでは、削除したい部分を正確に指定する必要があります。このメソッドはSplFileInfoオブジェクトから直接呼び出せるため、DirectoryIteratorなどでファイル情報を処理する際に便利です。ディレクトリを走査する際は、通常「.」と「..」をスキップする処理を忘れずに追加してください。また、ファイル操作を伴うため、エラー発生時にプログラムが停止しないよう、try-catchによる例外処理を適切に行うことが推奨されます。

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

1<?php
2
3/**
4 * DirectoryIterator::getBasename() メソッドの利用例を示します。
5 *
6 * この関数は、一時的なディレクトリとファイルを作成し、
7 * DirectoryIterator を用いてそれらのベース名を取得します。
8 * ベース名とは、ファイルやディレクトリのパスからディレクトリ部分を取り除いた名前です。
9 * オプションで拡張子などのサフィックスを取り除くこともできます。
10 */
11function demonstrateDirectoryIteratorGetBasename(): void
12{
13    // 一時的なテスト用ディレクトリを作成します。
14    // uniqid() を使用して一意な名前を生成し、既存のディレクトリと衝突しないようにします。
15    $testDir = __DIR__ . '/temp_dir_' . uniqid();
16
17    // ディレクトリの作成を試みます。失敗した場合はエラーメッセージを表示し終了します。
18    if (!mkdir($testDir) && !is_dir($testDir)) {
19        echo "エラー: テスト用ディレクトリ '{$testDir}' の作成に失敗しました。\n";
20        return;
21    }
22    echo "テスト用ディレクトリを作成しました: {$testDir}\n";
23
24    // テスト用ディレクトリ内にサンプルファイルを作成します。
25    $file1 = $testDir . '/document.txt';
26    $file2 = $testDir . '/image.jpeg';
27    $file3 = $testDir . '/archive.tar.gz';
28
29    file_put_contents($file1, 'これはテストファイル1の内容です。');
30    file_put_contents($file2, 'これはテストファイル2の内容です。');
31    file_put_contents($file3, 'これはテストファイル3の内容です。');
32    echo "サンプルファイルを作成しました。\n";
33
34    try {
35        // DirectoryIterator のインスタンスを作成し、テスト用ディレクトリを指定します。
36        $dirIterator = new DirectoryIterator($testDir);
37
38        echo "\n--- DirectoryIterator::getBasename() のデモンストレーション ---\n";
39
40        // ディレクトリ内の各項目をループで処理します。
41        foreach ($dirIterator as $fileInfo) {
42            // '.' (カレントディレクトリ) と '..' (親ディレクトリ) はスキップします。
43            if ($fileInfo->isDot()) {
44                continue;
45            }
46
47            // getFilename() はファイルまたはディレクトリのフル名を返します。
48            $fileName = $fileInfo->getFilename();
49            // getBasename() は拡張子を含んだベース名を返します。
50            $baseName = $fileInfo->getBasename();
51            // getBasename('.txt') は '.txt' 拡張子を取り除いたベース名を返します。
52            $baseNameWithoutTxt = $fileInfo->getBasename('.txt');
53            // getBasename('.tar.gz') は '.tar.gz' 拡張子を取り除いたベース名を返します。
54            $baseNameWithoutTarGz = $fileInfo->getBasename('.tar.gz');
55
56            echo "元のファイル名: '{$fileName}'\n";
57            echo "  getBasename() の結果: '{$baseName}'\n";
58            echo "  getBasename('.txt') の結果: '{$baseNameWithoutTxt}'\n";
59            echo "  getBasename('.tar.gz') の結果: '{$baseNameWithoutTarGz}'\n";
60            echo "--------------------------------------------------\n";
61        }
62    } catch (UnexpectedValueException $e) {
63        // ディレクトリが存在しないなど、予期しない値が渡された場合のエラーを捕捉します。
64        echo "エラー: " . $e->getMessage() . "\n";
65    } finally {
66        // 後処理: 作成したファイルとディレクトリを削除し、環境をクリーンアップします。
67        if (file_exists($file1)) {
68            unlink($file1);
69        }
70        if (file_exists($file2)) {
71            unlink($file2);
72        }
73        if (file_exists($file3)) {
74            unlink($file3);
75        }
76        if (is_dir($testDir)) {
77            rmdir($testDir);
78        }
79        echo "\nテスト用ディレクトリ '{$testDir}' をクリーンアップしました。\n";
80    }
81}
82
83// 関数を実行します。
84demonstrateDirectoryIteratorGetBasename();

DirectoryIterator::getBasename()メソッドは、PHPでファイルシステムを操作する際に、ファイルやディレクトリのパスからディレクトリ部分を除いた「ベース名」を取得するために使われます。このメソッドはDirectoryIteratorクラスのインスタンスに対して呼び出され、ディレクトリ内の各項目(ファイルやサブディレクトリ)の名前を処理する際に役立ちます。

引数$suffixはオプションで、文字列型で指定できます。この引数に.txtのようなファイル拡張子を渡すと、もしベース名の末尾がその$suffixと一致した場合、その部分を取り除いたベース名が戻り値として返されます。これにより、拡張子を含まないファイル名が必要な場合に便利です。戻り値は常に文字列型で、求められたベース名を提供します。

サンプルコードでは、まず一時的なディレクトリと複数のテストファイルを作成します。次に、DirectoryIteratorでこれらの項目を巡回し、getBasename()メソッドを引数なしで呼び出した場合と、特定の拡張子(.txt.tar.gz)を$suffixとして指定した場合の挙動を比較して出力しています。この例を通して、ファイル名から拡張子を柔軟に除去できるgetBasename()の機能が明確に理解できます。

getBasename()メソッドの引数$suffixは、ファイル名の末尾が指定された文字列と完全に一致する場合にのみ取り除かれる点にご注意ください。部分的な一致では取り除かれません。DirectoryIteratorでディレクトリを走査する際は、.(カレントディレクトリ)と..(親ディレクトリ)をisDot()メソッドで必ずスキップし、予期せぬ処理を避けましょう。サンプルコードのように一時的なファイルやディレクトリを作成する際は、処理完了後に必ずクリーンアップを行い、リソースを適切に解放することが重要です。ファイルやディレクトリの操作は予期せぬ失敗も考えられるため、エラーハンドリングを適切に行うことで、より堅牢なコードになります。

関連コンテンツ

関連IT用語

関連プログラミング言語