【PHP8.x】GlobIterator::getFileInfo()メソッドの使い方
getFileInfoメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getFileInfoメソッドは、GlobIteratorクラスに属するメソッドで、現在のイテレータが指し示す項目(ファイルまたはディレクトリ)の情報を取得します。GlobIteratorは、指定されたパターンに一致するファイルやディレクトリのパスを繰り返し処理するために使用されますが、このgetFileInfoメソッドを利用することで、単なるパス文字列だけでなく、その項目に関する詳細な属性にアクセスできるようになります。
具体的には、PHPの標準クラスであるSplFileInfoオブジェクトを返します。SplFileInfoオブジェクトは、ファイルの絶対パス、ファイル名、サイズ、最終更新日時、パーミッション、ファイルタイプ(通常ファイルかディレクトリか)、読み取り・書き込み権限など、ファイルシステム上の項目に関する豊富な情報を提供します。
このメソッドを使用することで、GlobIteratorで取得した各ファイルやディレクトリに対して、その詳細な属性に基づいて様々な処理を実行することが可能になります。例えば、特定の条件(ファイルサイズ、更新日時、ファイルタイプなど)に合致する項目のみをフィルタリングしたり、その情報を表示したりする際に非常に役立ちます。ファイルシステムを効率的に走査し、各要素の情報を柔軟に扱いたい場合に、getFileInfoメソッドは強力なツールとなります。
構文(syntax)
1<?php 2$iterator = new GlobIterator(__DIR__ . '/*.txt'); 3$fileInfo = $iterator->getFileInfo(); 4?>
引数(parameters)
string $class = RecursiveDirectoryIterator::class
- string $class = RecursiveDirectoryIterator::class: ファイル情報を取得する際に使用するクラスを指定します。デフォルトは
RecursiveDirectoryIterator::classです。
戻り値(return)
SplFileInfo
GlobIterator::getFileInfo()メソッドは、現在のディレクトリ要素の情報を持つSplFileInfoオブジェクトを返します。このオブジェクトを通じて、ファイル名やパス、パーミッションなどの詳細情報を取得できます。
サンプルコード
PHP GlobIterator::getFileInfo() によるファイル情報取得
1<?php 2 3// GlobIterator::getFileInfo() メソッドの使用例を示す関数 4function demonstrateGlobIteratorGetFileInfo(): void 5{ 6 // 1. GlobIterator で検索するためのテストファイルを作成します 7 $tempDir = sys_get_temp_dir() . '/glob_iterator_test_' . uniqid(); 8 if (!mkdir($tempDir) && !is_dir($tempDir)) { 9 echo "一時ディレクトリの作成に失敗しました: $tempDir\n"; 10 return; 11 } 12 echo "一時ディレクトリを作成しました: " . $tempDir . "\n"; 13 14 $testFiles = [ 15 $tempDir . '/document1.txt', 16 $tempDir . '/log_file.log', 17 $tempDir . '/report2.txt', 18 ]; 19 20 foreach ($testFiles as $file) { 21 file_put_contents($file, 'これはテストファイルです。'); 22 echo "テストファイルを作成しました: " . basename($file) . "\n"; 23 } 24 25 // 2. GlobIterator を使用して特定のパターンに一致するファイルを反復処理します 26 // ここでは、作成した一時ディレクトリ内の .txt または .log ファイルを検索します。 27 $pattern = $tempDir . '/*.{txt,log}'; 28 echo "\nGlobIterator を使ってパターン '{$pattern}' に一致するファイルを検索します。\n"; 29 30 try { 31 // GlobIterator のインスタンス化 32 // FilesystemIterator::CURRENT_AS_FILEINFO フラグは、foreach ループで 33 // SplFileInfo オブジェクトを直接取得できるようにします。 34 $iterator = new GlobIterator($pattern, FilesystemIterator::CURRENT_AS_FILEINFO); 35 36 if (!$iterator->valid()) { 37 echo "指定されたパターンに一致するファイルが見つかりませんでした。\n"; 38 } else { 39 echo "見つかったファイルの情報:\n"; 40 // イテレータをループして各ファイル情報を取得 41 foreach ($iterator as $file) { 42 // getFileInfo() メソッドは、現在の要素(ファイルまたはディレクトリ)に対応する 43 // SplFileInfo オブジェクトを返します。 44 // FilesystemIterator::CURRENT_AS_FILEINFO フラグを使用している場合、 45 // $file 変数自体が SplFileInfo オブジェクトになりますが、 46 // このメソッドの機能を示すために明示的に呼び出します。 47 $fileInfo = $iterator->getFileInfo(); // SplFileInfo のインスタンスを返す 48 49 echo " ファイル名: " . $fileInfo->getFilename() . "\n"; 50 echo " フルパス: " . $fileInfo->getPathname() . "\n"; 51 echo " ファイルサイズ: " . $fileInfo->getSize() . " バイト\n"; 52 echo " 最終更新日時: " . date('Y-m-d H:i:s', $fileInfo->getMTime()) . "\n"; 53 echo " タイプ: " . ($fileInfo->isFile() ? 'ファイル' : 'ディレクトリ') . "\n"; 54 echo " --------------------\n"; 55 } 56 } 57 } catch (UnexpectedValueException $e) { 58 // パターンが無効な場合などに発生するエラーを捕捉します。 59 echo "GlobIterator の初期化エラー: " . $e->getMessage() . "\n"; 60 } catch (Exception $e) { 61 // その他の予期せぬエラーを捕捉します。 62 echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n"; 63 } finally { 64 // 3. 後処理: 作成した一時ファイルとディレクトリを削除します 65 echo "\n一時ファイルとディレクトリをクリーンアップします。\n"; 66 foreach ($testFiles as $file) { 67 if (file_exists($file)) { 68 unlink($file); 69 echo "ファイルを削除しました: " . basename($file) . "\n"; 70 } 71 } 72 if (is_dir($tempDir)) { 73 rmdir($tempDir); 74 echo "ディレクトリを削除しました: " . $tempDir . "\n"; 75 } 76 } 77} 78 79// 関数を実行して GlobIterator::getFileInfo() の動作を確認します 80demonstrateGlobIteratorGetFileInfo();
PHPのGlobIteratorクラスは、特定のパターン(例えば*.txtやimages/*.{jpg,png}など)に一致するファイルやディレクトリを検索し、一つずつ処理する際に利用される便利な機能です。
このGlobIterator::getFileInfo()メソッドは、GlobIteratorが現在指し示している要素、つまり現在処理中のファイルやディレクトリの詳細な情報を取得するために使われます。このメソッドを呼び出すと、SplFileInfoという種類のオブジェクトが戻り値として返されます。SplFileInfoオブジェクトには、ファイル名、ファイルのフルパス、サイズ、最終更新日時、ファイル種別(ファイルかディレクトリか)など、様々なファイルに関する詳細な情報が格納されており、これらを使ってプログラムで柔軟な処理が可能になります。
引数$classはオプションで、デフォルトではRecursiveDirectoryIterator::classが設定されています。これは、返される情報オブジェクトをSplFileInfoの代わりに、より詳細な機能を持つ特定のカスタムクラスのインスタンスにしたい場合に指定できますが、通常はデフォルトのSplFileInfoで十分な場合が多いです。
サンプルコードでは、一時ディレクトリ内の特定の拡張子のファイルに対してGlobIteratorを使い、getFileInfo()メソッドを通して各ファイルの具体的な情報(ファイル名、サイズ、更新日時など)を取得し、表示する一連の流れを示しています。これにより、ファイルシステム上の情報を効率的に取得し、システム開発に活用することができます。
GlobIterator::getFileInfo() メソッドは、現在イテレータが指し示すファイルやディレクトリの詳細な情報を持つ SplFileInfo オブジェクトを返します。ファイル名、サイズ、更新日時などを取得する際に大変便利です。GlobIterator のコンストラクタで FilesystemIterator::CURRENT_AS_FILEINFO フラグを指定すると、foreach ループ内で SplFileInfo オブジェクトを直接受け取れるため、コードをより簡潔に記述できます。このメソッドの引数 $class を使用すると、返される SplFileInfo オブジェクトの具体的な型をカスタマイズできますので、必要に応じて応用を検討してください。ファイルシステムを扱うコードでは、一時ファイルの作成後の適切な削除や、try-catch によるエラーハンドリングを丁寧に行うことが、予期せぬ問題を防ぎ、堅牢なシステムを構築するために重要です。