【PHP8.x】RecursiveDirectoryIterator::getPathInfo()メソッドの使い方
getPathInfoメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getPathInfoメソッドは、現在のファイルシステム要素(ファイルやディレクトリ)に関する詳細な情報を取得するメソッドです。このメソッドは、PHPの標準的な機能であるSplFileInfoクラスを拡張し、ディレクトリを再帰的に探索するためのRecursiveDirectoryIteratorクラスに属しています。RecursiveDirectoryIteratorがイテレート中に指し示す、その時点でのファイルまたはディレクトリについて、そのパス、ファイル名、ファイルの種類、最終更新日時などのメタデータ情報をカプセル化したSplFileInfoオブジェクトとして提供します。
具体的には、getPathInfoメソッドを呼び出すと、現在のファイルシステム要素を表すSplFileInfoオブジェクトが返されます。この返されたSplFileInfoオブジェクトに対して、さらにgetFilename()メソッドでファイル名のみを取得したり、getExtension()メソッドでファイルの拡張子を抽出したり、isDir()メソッドでそれがディレクトリであるかを確認したりするなど、様々な追加の情報取得や判定が行えます。これにより、ディレクトリ内のファイルを種類別に処理したい場合や、特定の条件に合致するファイルを効率的に探し出したい場合に、柔軟かつ強力な手段を提供します。システムエンジニアを目指す方にとって、ファイルシステムの操作や管理を行う上で、このメソッドは非常に基本的ながらも重要な役割を果たします。
構文(syntax)
1<?php 2 3// 走査したいディレクトリのパスを指定してRecursiveDirectoryIteratorを作成します。 4// 例: 現在のスクリプトがあるディレクトリ 5$iterator = new RecursiveDirectoryIterator(__DIR__); 6 7// ディレクトリ内の各エントリ(ファイルやサブディレクトリ)を反復処理します。 8foreach ($iterator as $fileSystemEntry) { 9 // 現在のエントリ($fileSystemEntry)に対して getPathInfo() メソッドを呼び出します。 10 // このメソッドは、そのエントリに関する詳細情報を持つ SplFileInfo オブジェクトを返します。 11 $fileInfo = $fileSystemEntry->getPathInfo(); 12 13 // 返された SplFileInfo オブジェクトから、ファイル名などの情報を取得できます。 14 echo $fileInfo->getFilename() . "\n"; 15} 16 17?>
引数(parameters)
?string $class = null
- ?string $class = null: 取得するパス情報をクラス名でフィルタリングするための文字列。指定しない場合はすべてのパス情報が取得されます。
戻り値(return)
SplFileInfo
RecursiveDirectoryIterator::getPathInfo() は、現在のディレクトリのパス情報を表す SplFileInfo オブジェクトを返します。このオブジェクトを通して、パス名やファイル名などの詳細情報を取得できます。
サンプルコード
RecursiveDirectoryIterator::getPathInfo() でパス情報を取得する
1<?php 2 3/** 4 * デモンストレーション用のディレクトリとファイルを一時的に作成します。 5 * 6 * @param string $baseDir 一時ディレクトリを作成するベースパス 7 * @return string 作成された一時ディレクトリのパス 8 * @throws RuntimeException ディレクトリまたはファイルの作成に失敗した場合 9 */ 10function createDemoDirectory(string $baseDir): string 11{ 12 $testDir = $baseDir . DIRECTORY_SEPARATOR . 'rdi_pathinfo_demo_' . uniqid(); 13 if (!mkdir($testDir) && !is_dir($testDir)) { 14 throw new \RuntimeException(sprintf('ディレクトリ "%s" の作成に失敗しました。', $testDir)); 15 } 16 17 file_put_contents($testDir . DIRECTORY_SEPARATOR . 'document.txt', 'This is a test document.'); 18 file_put_contents($testDir . DIRECTORY_SEPARATOR . 'script.php', '<?php echo "Hello from PHP!";'); 19 20 $subDir = $testDir . DIRECTORY_SEPARATOR . 'subfolder'; 21 if (!mkdir($subDir) && !is_dir($subDir)) { 22 throw new \RuntimeException(sprintf('サブディレクトリ "%s" の作成に失敗しました。', $subDir)); 23 } 24 file_put_contents($subDir . DIRECTORY_SEPARATOR . 'log.log', 'Log entry 1.'); 25 26 return $testDir; 27} 28 29/** 30 * 指定されたディレクトリとその内容を再帰的に削除し、クリーンアップします。 31 * 32 * @param string $dirPath クリーンアップするディレクトリのパス 33 */ 34function cleanupDirectory(string $dirPath): void 35{ 36 if (!is_dir($dirPath)) { 37 return; 38 } 39 40 // RecursiveDirectoryIterator と RecursiveIteratorIterator を使用して、 41 // ディレクトリ内のすべてのファイルとサブディレクトリを効率的に反復処理します。 42 $rdi = new RecursiveDirectoryIterator($dirPath, RecursiveDirectoryIterator::SKIP_DOTS); 43 $rii = new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::CHILD_FIRST); 44 45 foreach ($rii as $file) { 46 if ($file->isDir()) { 47 // ディレクトリの場合、rmdir() で削除します 48 rmdir($file->getPathname()); 49 } else { 50 // ファイルの場合、unlink() で削除します 51 unlink($file->getPathname()); 52 } 53 } 54 // 空になったルートディレクトリを削除します 55 rmdir($dirPath); 56} 57 58// --- メインの実行ロジック --- 59 60$testDirectory = ''; // エラー発生時にもクリーンアップできるように初期化 61 62try { 63 // 1. デモンストレーション用のディレクトリとファイルを作成します。 64 // これにより、テスト用のファイルシステム構造が設定されます。 65 $testDirectory = createDemoDirectory(sys_get_temp_dir()); 66 echo "デモンストレーション用ディレクトリ: " . $testDirectory . "\n\n"; 67 68 // 2. RecursiveDirectoryIterator を作成します。 69 // これにより、指定されたディレクトリの直下の内容を反復処理できます。 70 // RecursiveDirectoryIterator::SKIP_DOTS フラグは、特殊なエントリである '.' (現在のディレクトリ) 71 // と '..' (親ディレクトリ) をスキップするために使用します。 72 $iterator = new RecursiveDirectoryIterator($testDirectory, RecursiveDirectoryIterator::SKIP_DOTS); 73 74 echo "RecursiveDirectoryIterator::getPathInfo() メソッドのデモンストレーション:\n"; 75 echo "---------------------------------------------------\n"; 76 77 // 3. ディレクトリ内の各エントリを反復処理します。 78 // このループでは、$entryIterator は、現在のファイルまたはサブディレクトリを表す 79 // RecursiveDirectoryIterator のインスタンスとなります。 80 foreach ($iterator as $name => $entryIterator) { 81 // 4. getPathInfo() メソッドを呼び出して、現在のエントリに関する SplFileInfo オブジェクトを取得します。 82 // このメソッドは、PHPの pathinfo() 関数が提供する情報と同様のパス情報を提供しますが、 83 // よりオブジェクト指向な形式で、より詳細なファイル情報へのアクセスも可能です。 84 // 引数 $class は省略されており、デフォルトの SplFileInfo クラスが使用されます。 85 $pathInfo = $entryIterator->getPathInfo(); 86 87 echo " エントリのフルパス名: " . $entryIterator->getPathname() . "\n"; 88 echo " - ベース名 (getPathInfo): " . $pathInfo->getBasename() . "\n"; // ファイルまたはディレクトリの名前 (例: "document.txt") 89 echo " - ファイル名 (getPathInfo): " . $pathInfo->getFilename() . "\n"; // ファイル名部分のみ (例: "document") 90 echo " - 拡張子 (getPathInfo): " . $pathInfo->getExtension() . "\n"; // ファイルの拡張子 (例: "txt", ディレクトリの場合は空文字列) 91 echo " - ディレクトリパス (getPathInfo): " . $pathInfo->getPath() . "\n"; // ファイルまたはディレクトリの親ディレクトリのパス 92 echo "---------------------------------------------------\n"; 93 } 94 95} catch (Exception $e) { 96 // 例外が発生した場合、エラーメッセージを表示します。 97 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 98} finally { 99 // 5. デモンストレーションが完了した後、作成した一時ディレクトリを必ずクリーンアップします。 100 // これにより、不要なファイルがシステムに残るのを防ぎます。 101 if (!empty($testDirectory) && is_dir($testDirectory)) { 102 cleanupDirectory($testDirectory); 103 echo "一時ディレクトリがクリーンアップされました。\n"; 104 } 105}
RecursiveDirectoryIteratorは、指定されたディレクトリとそのサブディレクトリ内のすべてのファイルやフォルダを、効率的に反復処理するためのクラスです。このクラスが提供するgetPathInfo()メソッドは、現在反復処理中のファイルまたはディレクトリに関する詳細なパス情報を、オブジェクト指向な形式で取得する際に利用されます。
このメソッドは、PHPの標準関数であるpathinfo()が提供する情報と類似していますが、その情報をSplFileInfoというオブジェクトとして返します。SplFileInfoオブジェクトからは、getFilename()でファイル名部分、getExtension()で拡張子、getPath()で親ディレクトリのパスなど、多岐にわたるファイル情報を簡単かつ安全に取得できます。
引数$classはオプションで、通常は省略されます。特定のカスタムクラスをSplFileInfoの代わりに返させたい場合に、そのクラス名を指定します。戻り値は常にSplFileInfoオブジェクトであり、ファイルやディレクトリの属性情報を統一的に扱うことが可能です。
サンプルコードでは、一時的に作成したディレクトリをRecursiveDirectoryIteratorで走査し、各エントリ(ファイルやサブディレクトリ)に対してgetPathInfo()を呼び出しています。そして、返されたSplFileInfoオブジェクトから、ベース名、ファイル名、拡張子、ディレクトリパスといった詳細な情報を取得し表示することで、このメソッドの具体的な挙動を示しています。これは、ファイルシステムのコンテンツを分析したり、特定の条件でファイルを分類・処理したりするシナリオで非常に役立ちます。
RecursiveDirectoryIterator::getPathInfo() メソッドは、イテレータが指し示すファイルやディレクトリのパス情報に特化した SplFileInfo オブジェクトを返します。これにより、ファイル名、拡張子、ディレクトリパスといった情報をオブジェクト指向的に、かつ安全に取得できます。PHPのグローバル関数 pathinfo() とは異なり、常に SplFileInfo インスタンスを返すため、情報へのアクセスが一貫した方法で可能です。引数 $class を省略した場合、デフォルトの SplFileInfo クラスのインスタンスが返されますが、必要に応じて独自の SplFileInfo を継承したクラスを指定することもできます。このメソッドは、ファイルパスの詳細情報を柔軟に扱いたい場合に役立ちます。
PHP RecursiveDirectoryIterator getPathInfo()でパス名を取得する
1<?php 2 3/** 4 * RecursiveDirectoryIterator と getPathInfo() を使用して、 5 * 指定されたディレクトリとそのサブディレクトリ内のファイルやディレクトリのフルパス名を取得するサンプル。 6 * 7 * getPathInfo() メソッドは、現在の要素(ファイルまたはディレクトリ)の 8 * SplFileInfo オブジェクトを返します。 9 * この SplFileInfo オブジェクトには、ファイル名、パス、拡張子など、 10 * ファイルに関する詳細な情報が含まれています。 11 * 12 * キーワード「getpathname」に関連して、getPathInfo() で得られた SplFileInfo オブジェクトから、 13 * さらに getPathname() メソッドを呼び出して、フルパス名を取得する例を示します。 14 */ 15 16// 走査対象のディレクトリパスを指定します。 17// ここではスクリプトが実行されている現在のディレクトリを指します。 18$directoryPath = __DIR__; 19 20try { 21 // RecursiveDirectoryIterator を初期化します。 22 // RecursiveDirectoryIterator::SKIP_DOTS は、'.' と '..' をスキップするために使用します。 23 $directoryIterator = new RecursiveDirectoryIterator( 24 $directoryPath, 25 RecursiveDirectoryIterator::SKIP_DOTS 26 ); 27 28 // RecursiveIteratorIterator を使用して、ディレクトリを再帰的に走査します。 29 // RecursiveIteratorIterator::SELF_FIRST は、ディレクトリ自身を先に、その後にその内容を走査することを意味します。 30 $iterator = new RecursiveIteratorIterator( 31 $directoryIterator, 32 RecursiveIteratorIterator::SELF_FIRST 33 ); 34 35 echo "--- ディレクトリ: {$directoryPath} 内のパス名一覧 ---\n"; 36 37 // イテレータをループして、各ファイルやディレクトリの情報を取得します。 38 foreach ($iterator as $item) { 39 // getPathInfo() メソッドを呼び出して、現在の要素の SplFileInfo オブジェクトを取得します。 40 // 引数 $class は省略可能です。指定しない場合、SplFileInfo クラスのインスタンスが返されます。 41 $splFileInfo = $item->getPathInfo(); 42 43 // SplFileInfo オブジェクトの getPathname() メソッドを使用して、 44 // ファイルまたはディレクトリのフルパス名を取得し、出力します。 45 // このパス名には、ファイル名またはディレクトリ名も含まれます。 46 echo $splFileInfo->getPathname() . "\n"; 47 } 48 49 echo "--------------------------------------------------\n"; 50 51} catch (UnexpectedValueException $e) { 52 // 指定されたパスが存在しない、またはアクセス権がない場合に発生する例外を処理します。 53 echo "エラー: ディレクトリ '{$directoryPath}' にアクセスできませんでした。" 54 . "詳細: {$e->getMessage()}\n"; 55} catch (Exception $e) { 56 // その他の予期せぬ例外を処理します。 57 echo "予期せぬエラーが発生しました。詳細: {$e->getMessage()}\n"; 58} 59
このPHPサンプルコードは、RecursiveDirectoryIteratorとgetPathInfo()メソッドを用いて、指定したディレクトリとそのサブディレクトリ内にあるファイルやディレクトリのフルパス名を取得する手順を示しています。getPathInfo()メソッドは、現在のイテレータが指し示す要素(ファイルやディレクトリ)について、その詳細な情報を含むSplFileInfoオブジェクトを返します。このメソッドの引数$classは省略可能で、特に指定しない場合は標準的なSplFileInfoクラスのインスタンスが戻り値となります。
得られたSplFileInfoオブジェクトには、ファイル名やディレクトリ名、そのパスや拡張子など、対象に関する多様な情報が集約されています。サンプルコードでは、このSplFileInfoオブジェクトからさらにgetPathname()メソッドを呼び出すことで、ファイルまたはディレクトリの完全なパス名を効率的に取得し、画面に表示しています。これにより、複雑なディレクトリ構造を持つプロジェクトでも、各要素の正確な位置を把握し、一覧表示することが容易になります。
このサンプルコードは、指定されたディレクトリを再帰的に走査し、各ファイルやディレクトリのフルパス名を取得する基本的な方法を示しています。getPathInfo()メソッドはSplFileInfoオブジェクトを返しますので、そのオブジェクトからgetPathname()だけでなく、ファイル名や拡張子、ファイル種別などの詳細情報を多岐にわたり取得できます。走査対象のディレクトリパスは__DIR__を使用していますが、運用時はセキュリティや信頼性を考慮し、常に適切なパスを指定することが重要です。大量のファイルや深い階層を扱う場合はパフォーマンスにも注意してください。また、RecursiveDirectoryIteratorとRecursiveIteratorIteratorは再帰的なファイル操作の基本となるため、それぞれの役割を理解しておくと、様々な場面で応用できます。引数$classは特別な目的がない限り、省略して問題ありません。ファイルアクセスに関連する例外処理も必ず適切に実装してください。