【PHP8.x】FilesystemIterator::getPathInfo()メソッドの使い方
getPathInfoメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getPathInfoメソッドは、現在のファイルシステム要素のパス情報を取得するメソッドです。
FilesystemIteratorクラスは、ファイルシステムを反復処理する際に使用され、指定されたディレクトリ内の各ファイルやサブディレクトリを順番にアクセスすることを可能にします。このgetPathInfoメソッドは、イテレータが現在指しているファイルまたはディレクトリについて、そのパスに関する詳細な情報を持つSplFileInfoオブジェクトを返します。
SplFileInfoオブジェクトは、ファイル名、ディレクトリ名、拡張子、ファイルの親ディレクトリのパスなど、様々なファイル属性にアクセスするための豊富なメソッドを提供します。例えば、取得したSplFileInfoオブジェクトからgetFilename()メソッドを呼び出してファイル名だけを取得したり、getExtension()メソッドでファイルの拡張子を取得したりすることができます。
このメソッドを利用することで、ファイルパス全体を文字列として扱うだけでなく、パスの各部分を個別に処理したり、ファイルの種別に応じて異なる操作を行ったりする際に非常に便利です。直接パス文字列を返すのではなく、オブジェクトとして情報を提供することで、より安全で柔軟なファイルパスの操作が可能になり、特に複雑なファイル操作を伴うアプリケーション開発において、コードの可読性と保守性を向上させるのに役立ちます。
構文(syntax)
1<?php 2// 現在のディレクトリを対象とするFilesystemIteratorのインスタンスを作成します 3$iterator = new FilesystemIterator('.'); 4 5// イテレータが指す現在の要素のパス情報をSplFileInfoオブジェクトとして取得します 6$pathInfo = $iterator->getPathInfo(); 7?>
引数(parameters)
?string $class = NULL
- string $class = NULL: 取得したいパス情報を表す文字列。NULLの場合は、FilesystemIterator::getPathname() と同じ形式で返します。
戻り値(return)
SplFileInfo
FilesystemIterator::getPathInfo は、現在のファイルまたはディレクトリに関する情報を持つ SplFileInfo オブジェクトを返します。このオブジェクトには、ファイル名、パス、サイズなどの詳細情報が含まれています。
サンプルコード
FilesystemIterator::getPathInfo() で親ディレクトリ情報を取得する
1<?php 2 3/** 4 * FilesystemIterator::getPathInfo() の使用例を示します。 5 * 6 * このメソッドは、現在の FilesystemIterator が指すファイルまたはディレクトリの「親ディレクトリ」の 7 * パス情報を SplFileInfo オブジェクトとして返します。 8 * これは、PHPの標準関数 pathinfo() で PATHINFO_DIRNAME を指定した結果に似た情報を提供しますが、 9 * 結果を SplFileInfo オブジェクトとして扱える点が異なります。 10 */ 11function demonstrateFilesystemIteratorGetPathInfo(): void 12{ 13 // 1. テスト環境の準備 (単体で動作可能にするため、一時ディレクトリとファイルを作成) 14 $testDir = sys_get_temp_dir() . '/php_fs_iterator_test_' . uniqid(); 15 if (!is_dir($testDir)) { 16 mkdir($testDir, 0777, true); 17 } 18 file_put_contents($testDir . '/file1.txt', 'Hello, PHP!'); 19 file_put_contents($testDir . '/image.jpg', 'Binary content placeholder'); 20 mkdir($testDir . '/subdir', 0777, true); 21 file_put_contents($testDir . '/subdir/doc.pdf', 'PDF content placeholder'); 22 file_put_contents($testDir . '/subdir/config.ini', 'ini content'); 23 24 echo "--- ディレクトリ '$testDir' のファイル情報を取得中 ---\n"; 25 echo "FilesystemIterator::getPathInfo() の動作に注目してください。\n"; 26 27 try { 28 // 2. FilesystemIterator をインスタンス化 29 // FilesystemIterator::SKIP_DOTS: '.' と '..' をスキップします。 30 // FilesystemIterator::CURRENT_AS_FILEINFO: 各エントリを SplFileInfo オブジェクトとして取得します。 31 $iterator = new FilesystemIterator($testDir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::CURRENT_AS_FILEINFO); 32 33 // 3. イテレータをループし、各エントリの情報を表示 34 foreach ($iterator as $fileInfo) { 35 // $fileInfo は現在のファイルまたはディレクトリを表す SplFileInfo オブジェクトです。 36 37 // getPathInfo() メソッドを呼び出すと、現在の $fileInfo が指すパスの「親ディレクトリ」を 38 // 表す新しい SplFileInfo オブジェクトが返されます。 39 // 例: $fileInfo が '/path/to/file.txt' を指す場合、 40 // $parentDirInfo は '/path/to' を指す SplFileInfo オブジェクトになります。 41 // 引数 $class に特定の SplFileInfo のサブクラス名を指定することで、 42 // そのサブクラスのオブジェクトを返すことも可能です(例: $fileInfo->getPathInfo(MyCustomFileInfo::class))。 43 $parentDirInfo = $fileInfo->getPathInfo(); 44 45 echo "----------------------------------------\n"; 46 echo "現在のエントリ (FilesystemIteratorが指すオブジェクト):\n"; 47 echo " ファイル/ディレクトリ名: " . $fileInfo->getFilename() . "\n"; 48 echo " フルパス: " . $fileInfo->getPathname() . "\n"; 49 echo " タイプ: " . $fileInfo->getType() . "\n"; 50 echo " 拡張子: " . ($fileInfo->isFile() ? $fileInfo->getExtension() : 'N/A') . "\n"; 51 52 echo "\n親ディレクトリの情報 (getPathInfo() の戻り値):\n"; 53 echo " 親ディレクトリのフルパス: " . $parentDirInfo->getPathname() . "\n"; 54 echo " 親ディレクトリの名前: " . $parentDirInfo->getFilename() . "\n"; 55 echo " 親ディレクトリのタイプ: " . $parentDirInfo->getType() . "\n"; 56 } 57 } catch (UnexpectedValueException $e) { 58 echo "エラー: 指定されたパス '$testDir' が無効です。\n"; 59 echo $e->getMessage() . "\n"; 60 } finally { 61 // 4. テスト環境のクリーンアップ 62 // RecursiveDirectoryIterator を使用して、サブディレクトリも含めて全て削除 63 if (is_dir($testDir)) { 64 $files = new RecursiveIteratorIterator( 65 new RecursiveDirectoryIterator($testDir, FilesystemIterator::SKIP_DOTS), 66 RecursiveIteratorIterator::CHILD_FIRST 67 ); 68 foreach ($files as $fileinfo) { 69 if ($fileinfo->isDir()) { 70 rmdir($fileinfo->getRealPath()); 71 } else { 72 unlink($fileinfo->getRealPath()); 73 } 74 } 75 rmdir($testDir); 76 } 77 echo "--- テストファイルとディレクトリをクリーンアップしました ---\n"; 78 } 79} 80 81// サンプルコードを実行 82demonstrateFilesystemIteratorGetPathInfo();
PHP 8のFilesystemIteratorクラスに属するgetPathInfo()メソッドは、ファイルシステムを反復処理する際に、現在のイテレータが指しているファイルまたはディレクトリの「親ディレクトリ」に関する情報を取得するために使用します。このメソッドを呼び出すと、親ディレクトリのパスを保持するSplFileInfoオブジェクトが戻り値として返されます。
例えば、イテレータが「/path/to/file.txt」を指している場合、getPathInfo()は「/path/to」というパスを表すSplFileInfoオブジェクトを返します。これは、PHPの標準関数であるpathinfo()でPATHINFO_DIRNAMEを指定した場合に取得できる情報と似ていますが、SplFileInfoオブジェクトとしてより豊富なファイル情報操作が可能な点で異なります。
引数$classはオプションで、SplFileInfoの代わりに指定したクラス(SplFileInfoのサブクラスである必要があります)のオブジェクトを戻り値として受け取るために利用できます。これにより、独自のファイル情報クラスを定義している場合に便利です。サンプルコードでは、一時ディレクトリを作成し、その中のファイルやサブディレクトリをFilesystemIteratorで順に処理しながら、getPathInfo()を使用して各エントリの親ディレクトリ情報を取得し、その詳細を表示しています。処理後には作成したテスト環境をクリーンアップします。
FilesystemIterator::getPathInfo()は、現在のファイルやディレクトリ「自身」の情報ではなく、「親ディレクトリ」のパス情報をSplFileInfoオブジェクトとして返します。PHPの標準関数pathinfo()(PATHINFO_DIRNAME指定時)と似ていますが、戻り値が文字列ではなくSplFileInfoオブジェクトであるため、親ディレクトリのパス名だけでなく、その種類や他の詳細情報をメソッドで取得できる点が大きな違いです。これにより、より柔軟にパス情報を扱えます。また、引数にSplFileInfoを継承したカスタムクラス名を指定すれば、そのクラスのオブジェクトとして親ディレクトリ情報を取得することも可能です。ファイルシステム操作では、対象パスが存在しないなどのエラーも考慮し、サンプルコードのように適切な例外処理を行うことが重要です。
FilesystemIterator::getPathInfo でパス名を取得する
1<?php 2 3// このサンプルコードは FilesystemIterator::getPathInfo() メソッドの使用法を示します。 4// まず、サンプルコードが動作するためのテスト用ディレクトリとファイルを一時的に作成します。 5$tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_fs_iterator_example_' . uniqid(); 6if (!mkdir($tempDir, 0777, true)) { 7 die("一時ディレクトリの作成に失敗しました: {$tempDir}"); 8} 9file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'report.txt', '週次レポート'); 10file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'config.ini', '設定データ'); 11mkdir($tempDir . DIRECTORY_SEPARATOR . 'logs', 0777, true); 12file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . 'error.log', 'エラーログ'); 13 14// スクリプトの実行が終了する際に、作成した一時ディレクトリとファイルを自動的に削除するよう登録します。 15// これにより、テスト環境がクリーンに保たれます。 16register_shutdown_function(function () use ($tempDir) { 17 if (is_dir($tempDir)) { 18 // ディレクトリとその内容を再帰的に削除するヘルパー関数 19 $deleteDirRecursive = function (string $dir) use (&$deleteDirRecursive) { 20 $items = array_diff(scandir($dir), ['.', '..']); 21 foreach ($items as $item) { 22 $path = $dir . DIRECTORY_SEPARATOR . $item; 23 is_dir($path) ? $deleteDirRecursive($path) : unlink($path); 24 } 25 rmdir($dir); 26 }; 27 $deleteDirRecursive($tempDir); 28 } 29}); 30 31/** 32 * FilesystemIterator::getPathInfo() を使用して、指定されたディレクトリ内の 33 * 各エントリ(ファイルまたはサブディレクトリ)の完全なパス情報を表示します。 34 * 35 * @param string $directoryPath 検索対象のディレクトリパス 36 * @return void 37 */ 38function displayEntryPathnames(string $directoryPath): void 39{ 40 echo "--- ディレクトリ '{$directoryPath}' 内のエントリパス情報 ---\n"; 41 42 try { 43 // FilesystemIterator をインスタンス化し、指定されたディレクトリを反復処理します。 44 // FilesystemIterator::SKIP_DOTS フラグにより、'.' (現在のディレクトリ) と '..' (親ディレクトリ) のエントリをスキップします。 45 $iterator = new FilesystemIterator($directoryPath, FilesystemIterator::SKIP_DOTS); 46 47 // ディレクトリ内の各エントリ(ファイルまたはサブディレクトリ)をループ処理します。 48 foreach ($iterator as $fileInfo) { 49 // $fileInfo は、現在のエントリ(ファイルやディレクトリ)を表す SplFileInfo オブジェクトです。 50 // FilesystemIterator::getPathInfo() メソッドは、この $fileInfo オブジェクト自体(またはそのサブクラス)を返します。 51 // これにより、元のエントリに関するパス、ファイル名、サイズ、更新時刻など、詳細なファイルシステム情報にアクセスできます。 52 // 引数 $class に特定の SplFileInfo サブクラス名を指定することも可能ですが、 53 // ここではデフォルトの SplFileInfo クラスのインスタンスを使用します。 54 $pathInfo = $fileInfo->getPathInfo(); 55 56 // キーワード「php getpathname」に最も関連する情報として、 57 // getPathInfo() から得られた SplFileInfo オブジェクトの getPathname() メソッドを呼び出し、 58 // エントリの完全なパス名(ディレクトリを含む絶対パス)を取得して表示します。 59 echo " - エントリの完全なパス名: " . $pathInfo->getPathname() . "\n"; 60 61 // SplFileInfo オブジェクトは、他にも様々な情報を提供します。 62 // 例: echo " ファイル名: " . $pathInfo->getFilename() . "\n"; 63 // 例: echo " 親ディレクトリパス: " . $pathInfo->getPath() . "\n"; 64 // 例: echo " ディレクトリか?: " . ($pathInfo->isDir() ? 'はい' : 'いいえ') . "\n"; 65 } 66 } catch (UnexpectedValueException $e) { 67 // 指定されたパスがディレクトリでない、またはアクセスできない場合に発生するエラーを捕捉します。 68 echo "エラー: 指定されたパス '{$directoryPath}' は有効なディレクトリではありません。- " . $e->getMessage() . "\n"; 69 } catch (Exception $e) { 70 // その他の予期しないエラーを捕捉します。 71 echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n"; 72 } 73 echo "--------------------------------------------------\n"; 74} 75 76// 作成した一時ディレクトリを引数として関数を呼び出し、サンプルを実行します。 77displayEntryPathnames($tempDir); 78 79?>
PHPのFilesystemIterator::getPathInfo()メソッドは、FilesystemIteratorでディレクトリ内の各エントリ(ファイルやサブディレクトリ)を反復処理する際に、そのエントリに関する詳細なファイルシステム情報を取得するために使用します。このメソッドは、SplFileInfoクラスのインスタンスを返します。
戻り値であるSplFileInfoオブジェクトには、ファイルのパス、ファイル名、サイズ、更新日時、パーミッションなど、多岐にわたる情報が含まれており、これらの情報にアクセスするための多くのメソッドが提供されています。例えば、サンプルコードでは、getPathInfo()から得られたSplFileInfoオブジェクトのgetPathname()メソッドを呼び出し、エントリの完全なパス名(ディレクトリを含む絶対パス)を取得して表示しています。これは、ファイルやディレクトリの場所を正確に知りたい場合に特に役立ちます。
引数$classはオプションで、デフォルトではSplFileInfoクラスのオブジェクトが返されますが、もしSplFileInfoを継承したカスタムクラスを使用したい場合は、そのクラス名を文字列で指定することが可能です。この機能により、ファイルシステム情報をより柔軟に扱えるようになります。FilesystemIterator::getPathInfo()は、ディレクトリ内のアイテムごとに細かな情報を取得し、条件分岐や表示内容の決定など、ファイルシステム操作の多くの場面で活用できる便利なメソッドです。
FilesystemIterator::getPathInfo()メソッドは、現在処理しているファイルやディレクトリに関する情報を含むSplFileInfoオブジェクトを返します。このメソッド自体が直接パス文字列を返すのではなく、返されたSplFileInfoオブジェクトに対してgetPathname()などのメソッドを呼び出すことで、完全なパス名やファイル名などの詳細情報を取得します。引数に特定のクラス名を指定しない限り、呼び出し元のSplFileInfoオブジェクトと同一のインスタンスが返される点にご留意ください。FilesystemIteratorは、存在しないパスやアクセス権のないパスを処理しようとすると例外を発生させるため、try-catchブロックによる適切なエラーハンドリングが非常に重要です。また、FilesystemIteratorをインスタンス化する際にFilesystemIterator::SKIP_DOTSフラグを使用しないと、.(カレントディレクトリ)と..(親ディレクトリ)のエントリも反復処理の対象となりますのでご注意ください。