【PHP8.x】RecursiveDirectoryIterator::getBasename()メソッドの使い方
getBasenameメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getBasenameメソッドは、PHPのRecursiveDirectoryIteratorオブジェクトが現在指している、ファイルまたはディレクトリのベースネームを取得するメソッドです。RecursiveDirectoryIteratorは、指定されたディレクトリとそのサブディレクトリを再帰的に走査するためのイテレータであり、このgetBasenameメソッドはその走査中に取得したパス情報から、ファイル名やディレクトリ名といった末尾の部分を簡潔に取り出すために利用されます。
このメソッドはオプションで一つの引数$suffixを受け取ることができます。$suffixに文字列を指定すると、取得されるベースネームの末尾がその文字列と一致した場合、その接尾辞が取り除かれた形でベースネームが返されます。例えば、「my_document.txt」というファイル名に対して$suffixとして「.txt」を指定すると、「my_document」が戻り値として得られます。$suffixを指定しない場合や、指定された$suffixがベースネームの末尾と一致しない場合は、接尾辞が取り除かれることなく、完全なファイル名またはディレクトリ名がそのまま返されます。
この機能により、ファイル拡張子を考慮に入れたファイル名の抽出や、特定のパターンを持つファイル名の一括処理などが容易になります。戻り値は常に文字列型で、抽出されたファイル名またはディレクトリ名を表します。
構文(syntax)
1<?php 2 3$iterator = new RecursiveDirectoryIterator(__DIR__); 4 5foreach ($iterator as $fileInfo) { 6 $basename = $fileInfo->getBasename(); 7 break; 8}
引数(parameters)
?string $suffix = null
- ?string $suffix = null: ファイル名に追加する接尾辞を指定します。指定しない場合は、ファイル名のみが返されます。
戻り値(return)
string
現在のディレクトリのベース名(ファイル名またはディレクトリ名のみ)を文字列として返します。
サンプルコード
PHP RecursiveDirectoryIterator::getBasename()でファイル名を取得する
1<?php 2 3/** 4 * 一時ディレクトリを作成し、サンプルファイルを配置する関数。 5 * 6 * @param string $baseDir ベースとなる一時ディレクトリのパス 7 * @throws RuntimeException ディレクトリ作成またはファイル書き込みに失敗した場合 8 */ 9function createSampleFiles(string $baseDir): void 10{ 11 // ディレクトリが存在しない場合は作成 12 if (!is_dir($baseDir) && !mkdir($baseDir, 0777, true)) { 13 throw new RuntimeException("Failed to create base directory: '$baseDir'"); 14 } 15 16 // サンプルファイルを配置 17 file_put_contents("$baseDir/document.txt", "This is a text document."); 18 file_put_contents("$baseDir/report.pdf", "This is a PDF report."); 19 file_put_contents("$baseDir/archive.tar.gz", "This is a compressed archive."); 20 21 // サブディレクトリとファイルも作成 22 if (!mkdir("$baseDir/images", 0777)) { 23 throw new RuntimeException("Failed to create subdir: '$baseDir/images'"); 24 } 25 file_put_contents("$baseDir/images/photo.jpg", "Binary image data."); 26 file_put_contents("$baseDir/images/icon.png", "Binary icon data."); 27 28 echo "Created sample files in: '$baseDir'\n\n"; 29} 30 31/** 32 * 指定されたディレクトリとその内容を再帰的に削除する関数。 33 * 34 * @param string $baseDir 削除するディレクトリのパス 35 */ 36function cleanupSampleFiles(string $baseDir): void 37{ 38 if (!is_dir($baseDir)) { 39 return; // ディレクトリが存在しない場合は何もしない 40 } 41 42 // RecursiveDirectoryIterator と RecursiveIteratorIterator を使用してディレクトリツリーを走査 43 // RecursiveDirectoryIterator::SKIP_DOTS は "." と ".." をスキップします 44 // RecursiveIteratorIterator::CHILD_FIRST は子要素(ファイル)から先に処理します 45 $files = new RecursiveIteratorIterator( 46 new RecursiveDirectoryIterator($baseDir, RecursiveDirectoryIterator::SKIP_DOTS), 47 RecursiveIteratorIterator::CHILD_FIRST 48 ); 49 50 foreach ($files as $fileinfo) { 51 if ($fileinfo->isDir()) { 52 rmdir($fileinfo->getRealPath()); // ディレクトリを削除 53 } else { 54 unlink($fileinfo->getRealPath()); // ファイルを削除 55 } 56 } 57 rmdir($baseDir); // ベースディレクトリを削除 58 echo "\nCleaned up sample directory: '$baseDir'\n"; 59} 60 61// スクリプトが実行される一時ディレクトリのパスを定義 62$tempDir = __DIR__ . '/recursive_basename_example_dir'; 63 64// スクリプトの終了時に、必ず一時ディレクトリをクリーンアップするように登録 65register_shutdown_function('cleanupSampleFiles', $tempDir); 66 67try { 68 // サンプルファイルとディレクトリを作成 69 createSampleFiles($tempDir); 70 71 echo "--- Demonstrating RecursiveDirectoryIterator::getBasename() ---\n"; 72 echo "このメソッドは、PHPのグローバル関数である basename() と同様の機能を提供しますが、\n"; 73 echo "SplFileInfoオブジェクト(イテレータによって返されるものなど)のメソッドとして呼び出されます。\n\n"; 74 75 // RecursiveDirectoryIterator を初期化 76 // RecursiveDirectoryIterator::SKIP_DOTS フラグは "." (現在のディレクトリ) と ".." (親ディレクトリ) をスキップします 77 $iterator = new RecursiveDirectoryIterator($tempDir, RecursiveDirectoryIterator::SKIP_DOTS); 78 79 // RecursiveIteratorIterator を使用して、ディレクトリツリー全体を再帰的に走査します 80 $recursiveIterator = new RecursiveIteratorIterator($iterator); 81 82 foreach ($recursiveIterator as $fileInfo) { 83 // $fileInfo は SplFileInfo クラスのインスタンス(またはその子クラス)です。 84 // getBasename() メソッドを呼び出すことで、ファイルまたはディレクトリの名前部分を取得できます。 85 86 echo "Path: '{$fileInfo->getPathname()}'\n"; 87 88 // 1. 引数なしで getBasename() を呼び出す場合: 89 // ファイル名全体またはディレクトリ名全体が返されます。 90 $basenameWithoutSuffix = $fileInfo->getBasename(); 91 echo " - getBasename() : '{$basenameWithoutSuffix}'\n"; 92 93 // 2. 引数にサフィックスを指定して getBasename() を呼び出す場合: 94 // 指定したサフィックスがファイル名の末尾にあれば、それが取り除かれて返されます。 95 // 大文字・小文字は区別されます。 96 97 // 例1: 'document.txt' から '.txt' を取り除く 98 if ($fileInfo->getFilename() === 'document.txt') { 99 $basenameWithTxtSuffix = $fileInfo->getBasename('.txt'); 100 echo " - getBasename('.txt') : '{$basenameWithTxtSuffix}'\n"; 101 } 102 103 // 例2: 'archive.tar.gz' から '.tar.gz' を取り除く 104 if ($fileInfo->getFilename() === 'archive.tar.gz') { 105 $basenameWithTarGzSuffix = $fileInfo->getBasename('.tar.gz'); 106 echo " - getBasename('.tar.gz') : '{$basenameWithTarGzSuffix}'\n"; 107 } 108 109 // 例3: 'photo.jpg' から '.jpg' を取り除く 110 if ($fileInfo->getFilename() === 'photo.jpg') { 111 $basenameWithJpgSuffix = $fileInfo->getBasename('.jpg'); 112 echo " - getBasename('.jpg') : '{$basenameWithJpgSuffix}'\n"; 113 } 114 115 // ディレクトリ名の場合は、サフィックスを指定しても何も起こりません 116 // (ディレクトリは拡張子を持たないため、サフィックスは一致しない) 117 if ($fileInfo->isDir() && $fileInfo->getFilename() === 'images') { 118 $basenameDirWithSuffix = $fileInfo->getBasename('.xyz'); 119 echo " - getBasename('.xyz') (dir) : '{$basenameDirWithSuffix}'\n"; 120 } 121 122 echo "\n"; 123 } 124 125} catch (RuntimeException $e) { 126 // ファイルやディレクトリの作成・削除でエラーが発生した場合 127 echo "Error during setup/cleanup: " . $e->getMessage() . "\n"; 128 exit(1); 129} catch (UnexpectedValueException $e) { 130 // RecursiveDirectoryIterator の初期化で不正なパスが指定された場合など 131 echo "Error with directory iterator: " . $e->getMessage() . "\n"; 132 exit(1); 133} catch (Throwable $e) { 134 // その他の予期せぬエラー 135 echo "An unexpected error occurred: " . $e->getMessage() . "\n"; 136 exit(1); 137}
PHPのRecursiveDirectoryIterator::getBasename()メソッドは、ファイルパスからファイル名またはディレクトリ名(いわゆるベース名)だけを取得するために使用されます。このメソッドは、RecursiveDirectoryIteratorのようなイテレータがディレクトリツリーを走査する際に返すSplFileInfoオブジェクトに対して呼び出されます。PHPのグローバル関数であるbasename()と同様の機能を提供しますが、オブジェクト指向の文脈で利用できる点が特徴です。
引数$suffixはオプションで、指定するとファイル名の末尾がその文字列と一致した場合に、その部分を取り除いた名前を返します。例えば、.txtを指定するとdocument.txtからは.txtが取り除かれdocumentが返されます。この照合は大文字・小文字を区別します。戻り値は、取得されたベース名を表す文字列です。
このサンプルコードでは、まず一時的なディレクトリと複数のサンプルファイル、およびサブディレクトリを作成します。次に、RecursiveDirectoryIteratorとRecursiveIteratorIteratorを使用して、作成したディレクトリツリー内の全てのファイルとディレクトリを再帰的に走査しています。それぞれのSplFileInfoオブジェクトに対してgetBasename()メソッドを呼び出し、引数なしの場合や、.txt、.tar.gz、.jpgといった特定のサフィックスを指定した場合の戻り値を示しています。これにより、ファイルの種類に応じて拡張子を取り除いたファイル名を取得できることを具体的に確認できます。ディレクトリ名の場合は、サフィックスを指定しても変更されない挙動も示されています。不要になった一時ディレクトリはスクリプト終了時に自動で削除されます。
RecursiveDirectoryIterator::getBasename()は、SplFileInfoオブジェクトが持つメソッドで、ファイルパス全体ではなく、ファイルやディレクトリの「名前部分」を取得します。PHPのグローバル関数basename()と機能は似ていますが、呼び出し方が異なります。引数にサフィックスを指定すると、その文字列がファイル名の末尾と完全に一致する場合にのみ取り除かれます。この際、大文字・小文字は厳密に区別されますので注意が必要です。ディレクトリ名に対してサフィックスを指定しても、通常は変化しません。ファイルシステムを操作する際は、サンプルコードのように一時ディレクトリの適切なクリーンアップやエラーハンドリングを必ず考慮してください。
RecursiveDirectoryIterator と getBasename でファイル名を取得する
1<?php 2 3/** 4 * RecursiveDirectoryIterator と getBasename メソッドの使用例。 5 * ファイルシステムを再帰的に走査し、各項目(ファイルまたはディレクトリ)のベース名を取得します。 6 * 7 * システムエンジニアを目指す初心者向けに、テスト環境のセットアップからクリーンアップまで含めています。 8 */ 9 10// テスト用のディレクトリとファイルを作成するヘルパー関数 11function setupTestEnvironment(string $baseDir): void 12{ 13 // ディレクトリが存在しない場合は作成 14 if (!is_dir($baseDir)) { 15 mkdir($baseDir, 0777, true); 16 } 17 18 // テストファイルを作成 19 file_put_contents($baseDir . '/document.txt', 'This is a text document.'); 20 file_put_contents($baseDir . '/image.jpg', 'Image data simulation.'); 21 22 // サブディレクトリを作成 23 mkdir($baseDir . '/subdir', 0777, true); 24 file_put_contents($baseDir . '/subdir/script.php', '<?php echo "Hello, world!";'); 25 file_put_contents($baseDir . '/subdir/report.pdf', 'PDF report content.'); 26} 27 28// テスト用のディレクトリとファイルをクリーンアップするヘルパー関数 29function cleanupTestEnvironment(string $baseDir): void 30{ 31 if (!is_dir($baseDir)) { 32 return; // ディレクトリが存在しない場合は何もしない 33 } 34 35 // RecursiveDirectoryIterator と RecursiveIteratorIterator を使用して、 36 // ディレクトリ内のすべてのファイルとサブディレクトリを再帰的に削除します。 37 // FilesystemIterator::SKIP_DOTS は '.' と '..' をスキップします。 38 $iterator = new RecursiveDirectoryIterator($baseDir, FilesystemIterator::SKIP_DOTS); 39 40 // RecursiveIteratorIterator::CHILD_FIRST は、子要素(ファイル)から先に処理し、 41 // その後に親ディレクトリを処理するように指定します。 42 // これにより、ディレクトリが空になってから削除できるようになります。 43 $recursiveIterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); 44 45 foreach ($recursiveIterator as $item) { 46 if ($item->isDir()) { 47 // ディレクトリの場合、rmdir で削除 48 rmdir($item->getPathname()); 49 } else { 50 // ファイルの場合、unlink で削除 51 unlink($item->getPathname()); 52 } 53 } 54 // 最上位のテストディレクトリを削除 55 rmdir($baseDir); 56} 57 58// --- メイン処理 --- 59$testDirectory = 'my_test_directory_for_basename'; 60 61// 以前の実行で残ったテスト環境があれば削除し、新しくセットアップ 62cleanupTestEnvironment($testDirectory); 63setupTestEnvironment($testDirectory); 64 65echo "--- RecursiveDirectoryIterator と getBasename の動作例 ---\n"; 66echo "対象ディレクトリ: " . $testDirectory . "\n\n"; 67 68try { 69 // RecursiveDirectoryIterator を使用して、指定されたディレクトリを操作するイテレータを作成 70 // FilesystemIterator::SKIP_DOTS を指定すると、現在のディレクトリ(.)と親ディレクトリ(..)のエントリをスキップします。 71 $directoryIterator = new RecursiveDirectoryIterator($testDirectory, FilesystemIterator::SKIP_DOTS); 72 73 // RecursiveIteratorIterator を使用して、ディレクトリツリーを再帰的に走査します。 74 // これにより、サブディレクトリ内のファイルも処理できるようになります。 75 $recursiveIterator = new RecursiveIteratorIterator($directoryIterator); 76 77 // イテレータをループして、各ファイルまたはディレクトリを処理 78 foreach ($recursiveIterator as $item) { 79 // $item は SplFileInfo オブジェクトであり、ファイルやディレクトリの情報を提供します。 80 // getBasename() メソッドは、パスの最後のコンポーネント(ファイル名またはディレクトリ名)を返します。 81 $basename = $item->getBasename(); 82 83 // オプション引数 $suffix を指定すると、そのサフィックスがベース名から取り除かれます。 84 // 例: '.txt' を指定すると、"document.txt" から ".txt" が取り除かれ "document" になります。 85 $basenameWithoutTxt = $item->getBasename('.txt'); 86 $basenameWithoutPhp = $item->getBasename('.php'); 87 88 echo "元のパス: " . $item->getPathname() . "\n"; 89 echo " - ベース名 (拡張子あり): " . $basename . "\n"; 90 91 // ファイルの場合、特定の拡張子を除いたベース名も表示 92 if ($item->isFile()) { 93 if (str_ends_with($item->getFilename(), '.txt')) { 94 echo " - ベース名 ('.txt' 除外): " . $basenameWithoutTxt . "\n"; 95 } 96 if (str_ends_with($item->getFilename(), '.php')) { 97 echo " - ベース名 ('.php' 除外): " . $basenameWithoutPhp . "\n"; 98 } 99 } 100 echo "\n"; 101 } 102 103} catch (UnexpectedValueException $e) { 104 // 指定されたパスがディレクトリではない、またはアクセスできない場合に発生 105 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 106} finally { 107 // 処理の終了後、作成したテスト環境をクリーンアップ 108 cleanupTestEnvironment($testDirectory); 109 echo "テスト環境をクリーンアップしました。\n"; 110} 111 112?>
このPHPサンプルコードは、ファイルシステムを再帰的に走査し、各項目(ファイルまたはディレクトリ)の「ベース名」を取得するRecursiveDirectoryIterator::getBasenameメソッドの使用方法を、システムエンジニアを目指す初心者向けに解説しています。実行環境として、setupTestEnvironment関数で一時的なテスト用ディレクトリとファイル群を作成し、処理終了後にはcleanupTestEnvironment関数でこれらを削除することで、安全に試せるように配慮しています。
コードの主な部分では、RecursiveDirectoryIteratorを使って指定されたディレクトリの内容を反復可能にし、さらにRecursiveIteratorIteratorを組み合わせることで、サブディレクトリの中まで含めたファイルツリー全体を深く走査しています。
ループ内で取得される各ファイルやディレクトリのSplFileInfoオブジェクトに対し、getBasenameメソッドを呼び出しています。このメソッドは、ファイルやディレクトリのパスから、パスの最後の部分、すなわち「ファイル名」や「ディレクトリ名」を文字列として返します。例えば、'/path/to/my_file.txt'からは'my_file.txt'が取得されます。
getBasenameメソッドには、オプションとして$suffixという文字列型の引数を指定できます。この$suffixに例えば.txtのような拡張子を指定すると、戻り値のベース名からその拡張子が取り除かれた文字列が返されます。これにより、'my_file.txt'から.txtを除いた'my_file'を取得するといった柔軟な操作が可能です。メソッドの戻り値は常に文字列型です。
このコードは、ファイル操作におけるパスの基本的な処理と、ディレクトリツリーを効率的に探索する強力なパターンを学ぶための良い出発点となります。
getBasenameメソッドは、パスの最後の要素から指定されたサフィックスを取り除きます。これは拡張子だけでなく任意の文字列を除去できるため、意図しない部分が消えないよう注意が必要です。ファイルシステムを操作する際には、パーミッションエラーやファイルが存在しないなどの例外が発生する可能性がありますので、必ず適切なエラーハンドリングを実装してください。テストや一時的な処理で作成したファイルやディレクトリは、処理の終了後に必ずクリーンアップする習慣をつけましょう。RecursiveDirectoryIteratorとRecursiveIteratorIteratorを使う際は、特にSKIP_DOTSなどのフラグを理解し、対象範囲を誤らないように注意深く使用することが大切です。