【PHP8.x】RecursiveDirectoryIterator::getFileInfo()メソッドの使い方
getFileInfoメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getFileInfoメソッドは、PHPのSpl(Standard PHP Library)拡張にあるRecursiveDirectoryIteratorクラスに属し、現在のイテレータが指すファイルまたはディレクトリのSplFileInfoオブジェクトを返すメソッドです。
RecursiveDirectoryIteratorは、指定されたディレクトリとそのサブディレクトリの内容を再帰的に走査するためのイテレータです。このイテレータを使用すると、ファイルシステム内の特定の階層構造を持つファイルを効率的に処理できます。
getFileInfoメソッドは、RecursiveDirectoryIteratorが現在指し示しているファイルまたはディレクトリに関する詳細な情報を取得する際に利用されます。このメソッドを呼び出すと、ファイルパス、ファイル名、ファイルサイズ、最終変更日時、パーミッションなどの多様な属性を持つSplFileInfoクラスのインスタンスが返されます。SplFileInfoオブジェクトを使用することで、ファイルシステム関連のさまざまな操作や情報へのアクセスが標準化された方法で行えるため、コードの可読性と保守性が向上します。
例えば、特定のディレクトリ内のすべてのファイルについて詳細な情報を収集し、それらを条件に基づいてフィルタリングしたり、並べ替えたりするようなシナリオでgetFileInfoメソッドは非常に有用です。このメソッドは、ファイルやディレクトリの情報を取得するための、強力かつ柔軟な手段を提供し、システムエンジニアがファイルシステムを扱うプログラムを開発する上で不可欠な機能の一つと言えるでしょう。
構文(syntax)
1<?php 2$directoryIterator = new RecursiveDirectoryIterator('/path/to/directory'); 3$splFileInfoObject = $directoryIterator->getFileInfo(); 4?>
引数(parameters)
string $class = SplFileInfo::class
- string $class = SplFileInfo::class: 取得するファイル情報のクラスを指定する文字列。デフォルトは
SplFileInfo::classです。
戻り値(return)
SplFileInfo
このメソッドは、現在のディレクトリ項目に対応するSplFileInfoオブジェクトを返します。
サンプルコード
PHP: RecursiveDirectoryIteratorでのファイル情報取得
1<?php 2 3/** 4 * RecursiveDirectoryIterator と getFileInfo() メソッドの使用例。 5 * 指定されたディレクトリを再帰的に走査し、各ファイル/ディレクトリの情報を取得・表示します。 6 */ 7function demonstrateGetFileInfo(): void 8{ 9 // 1. テスト用のディレクトリとファイルを作成 10 $testDir = 'temp_recursive_getfileinfo_test'; 11 if (!is_dir($testDir)) { 12 mkdir($testDir); 13 } 14 if (!is_dir($testDir . '/subdir')) { 15 mkdir($testDir . '/subdir'); 16 } 17 file_put_contents($testDir . '/file1.txt', 'This is file1.'); 18 file_put_contents($testDir . '/subdir/file2.log', 'This is file2.'); 19 file_put_contents($testDir . '/subdir/file3.json', '{}'); 20 21 echo "--- ディレクトリツリーを走査し、ファイル情報を取得します ---\n"; 22 23 try { 24 // RecursiveDirectoryIterator のインスタンスを作成 25 // RecursiveDirectoryIterator::SKIP_DOTS フラグを指定して、'.' と '..' をスキップします。 26 $directoryIterator = new RecursiveDirectoryIterator( 27 $testDir, 28 RecursiveDirectoryIterator::SKIP_DOTS 29 ); 30 31 // RecursiveIteratorIterator を使ってディレクトリツリーを再帰的に走査 32 // RecursiveIteratorIterator::SELF_FIRST は、ディレクトリ自身も最初に処理対象とすることを示します。 33 $iterator = new RecursiveIteratorIterator( 34 $directoryIterator, 35 RecursiveIteratorIterator::SELF_FIRST 36 ); 37 38 foreach ($iterator as $path => $currentIteratorObject) { 39 // foreach ループで得られる $currentIteratorObject は RecursiveDirectoryIterator のインスタンスです。 40 // getFileInfo() メソッドを使用して、この要素の SplFileInfo オブジェクトを取得します。 41 // 引数を省略すると、デフォルトで SplFileInfo::class のインスタンスが返されます。 42 // これにより、RecursiveDirectoryIterator オブジェクトから汎用的な SplFileInfo オブジェクトに変換し、 43 // ファイルパス、サイズ、更新日時などの情報を簡単に取得できます。 44 $splFileInfo = $currentIteratorObject->getFileInfo(); 45 46 echo "パス: " . $splFileInfo->getPathname() . "\n"; 47 echo "ファイル名: " . $splFileInfo->getFilename() . "\n"; 48 echo "タイプ: " . ($splFileInfo->isDir() ? "ディレクトリ" : "ファイル") . "\n"; 49 50 if ($splFileInfo->isFile()) { 51 echo "サイズ: " . $splFileInfo->getSize() . " バイト\n"; 52 echo "最終更新日時: " . date("Y-m-d H:i:s", $splFileInfo->getMTime()) . "\n"; 53 } 54 echo "--------------------\n"; 55 } 56 } catch (Exception $e) { 57 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 58 } finally { 59 // 2. テスト用ディレクトリとファイルをクリーンアップ 60 // 再帰的にディレクトリを削除するヘルパー関数 61 $removeDir = function (string $dir) use (&$removeDir): bool { 62 $files = array_diff(scandir($dir), ['.', '..']); 63 foreach ($files as $file) { 64 $path = "$dir/$file"; 65 (is_dir($path)) ? $removeDir($path) : unlink($path); 66 } 67 return rmdir($dir); 68 }; 69 70 if (is_dir($testDir)) { 71 $removeDir($testDir); 72 echo "テストディレクトリ '" . $testDir . "' を削除しました。\n"; 73 } 74 } 75} 76 77// 関数の実行 78demonstrateGetFileInfo(); 79 80?>
PHPのRecursiveDirectoryIterator::getFileInfo()メソッドは、ディレクトリを再帰的に走査する際に、現在注目しているファイルやディレクトリの詳細な情報を取得するために使用されます。このメソッドはRecursiveDirectoryIteratorクラスに属しており、指定されたディレクトリとそのサブディレクトリを効率的に巡回する機能を提供します。
getFileInfo()メソッドを呼び出す際、オプションで引数$classにクラス名を指定できますが、通常はデフォルト値のSplFileInfo::classが適用され、SplFileInfoオブジェクトが戻り値として返されます。このSplFileInfoオブジェクトは、ファイルやディレクトリのパス名、ファイル名、タイプ(ファイルかディレクトリか)、サイズ、最終更新日時といった汎用的なファイル情報を扱うためのメソッドを多数提供しています。
サンプルコードでは、まずRecursiveDirectoryIteratorとRecursiveIteratorIteratorを使って、指定したディレクトリとそのサブディレクトリを再帰的に走査しています。foreachループで各要素が処理される際、getFileInfo()メソッドを呼び出すことで、その要素に対応するSplFileInfoオブジェクトを取得しています。これにより、ファイルやディレクトリのタイプを判別したり、ファイルであればそのサイズや最終更新日時などの詳細な情報を簡単に取得し、表示できることを示しています。このようにgetFileInfo()は、ファイルシステムの探索や管理を行うプログラムにおいて、各ファイルやディレクトリの情報を柔軟に操作するための重要な手段となります。
getFileInfo()メソッドは、RecursiveDirectoryIteratorが指すファイルやディレクトリの情報を、汎用的なSplFileInfoオブジェクトとして取得するために利用します。これにより、ファイルパス、サイズ、更新日時などの属性に簡単にアクセスできます。引数を省略するとデフォルトでSplFileInfoインスタンスが返されますが、必要に応じてSplFileInfoを継承したカスタムクラスを指定することも可能です。
サンプルコードではRecursiveDirectoryIteratorをRecursiveIteratorIteratorと組み合わせて使用しており、これがディレクトリツリーを再帰的に走査する標準的な方法です。ファイルシステム操作は権限不足などでエラーが発生しやすいため、必ずtry-catchブロックで適切にエラーを処理してください。また、コード内のテスト用ディレクトリ作成と削除は、動作確認のための一時的な処理であり、実際のアプリケーションでは既存のディレクトリ構造に対して適用します。
PHP getFileInfoでファイルリストを再帰取得
1<?php 2 3/** 4 * 指定されたディレクトリ内のファイルとディレクトリを再帰的にリストアップし、 5 * RecursiveDirectoryIterator::getFileInfo() メソッドの使用例を示します。 6 * システムエンジニアを目指す初心者向けに、単体で動作可能な簡潔なコードです。 7 * 8 * @param string $directoryPath 走査するディレクトリのパス 9 */ 10function getFilesRecursivelyUsingGetFileInfo(string $directoryPath): void 11{ 12 // サンプルコードが単体で動作するように、指定されたディレクトリが存在しない場合は一時的に作成します。 13 // 実際には既存のディレクトリパスを指定して使用します。 14 $cleanupRequired = false; 15 if (!file_exists($directoryPath)) { 16 echo "指定されたディレクトリ '{$directoryPath}' が存在しないため、サンプル用に作成します。" . PHP_EOL; 17 mkdir($directoryPath, 0777, true); 18 mkdir($directoryPath . DIRECTORY_SEPARATOR . 'subdir', 0777, true); 19 file_put_contents($directoryPath . DIRECTORY_SEPARATOR . 'file1.txt', 'This is content of file1.'); 20 file_put_contents($directoryPath . DIRECTORY_SEPARATOR . 'subdir' . DIRECTORY_SEPARATOR . 'file2.txt', 'Content of file2.'); 21 file_put_contents($directoryPath . DIRECTORY_SEPARATOR . 'another_file.log', 'Log entry line 1.' . PHP_EOL . 'Log entry line 2.'); 22 $cleanupRequired = true; // 作成したディレクトリは後でクリーンアップします。 23 } 24 25 echo "ディレクトリ '{$directoryPath}' の内容を再帰的にリストアップ:" . PHP_EOL; 26 echo "--------------------------------------------------------" . PHP_EOL; 27 28 try { 29 // RecursiveDirectoryIterator: 指定されたディレクトリを走査し、各エントリの情報を取得します。 30 // SKIP_DOTS フラグは、'.' (現在のディレクトリ) と '..' (親ディレクトリ) をスキップするために使用します。 31 $dirIterator = new RecursiveDirectoryIterator($directoryPath, RecursiveDirectoryIterator::SKIP_DOTS); 32 33 // RecursiveIteratorIterator: RecursiveDirectoryIterator をラップすることで、サブディレクトリも再帰的に走査できるようにします。 34 // SELF_FIRST フラグは、ディレクトリ自体の情報もファイルの前に取得するために使用します。 35 $iterator = new RecursiveIteratorIterator($dirIterator, RecursiveIteratorIterator::SELF_FIRST); 36 37 // ディレクトリを再帰的に走査します。 38 foreach ($iterator as $path => $fileInfoFromCurrent) { 39 // RecursiveDirectoryIterator::getFileInfo() メソッドを使用します。 40 // $iterator->getInnerIterator() で現在の RecursiveDirectoryIterator インスタンスを取得し、 41 // そのインスタンスに対して getFileInfo() を呼び出します。 42 // 43 // 注意: foreach ループの `$fileInfoFromCurrent` 変数も SplFileInfo オブジェクトですが、 44 // ここではリファレンスで指定された getFileInfo() メソッドの使用例として、明示的に呼び出しています。 45 $splFileInfo = $iterator->getInnerIterator()->getFileInfo(); 46 47 // 取得した SplFileInfo オブジェクトから様々なファイル情報を取得・表示できます。 48 echo 'パス: ' . $splFileInfo->getPathname(); // ファイルやディレクトリのフルパス 49 if ($splFileInfo->isFile()) { 50 echo ' (ファイル, サイズ: ' . $splFileInfo->getSize() . ' バイト, 最終更新: ' . date('Y-m-d H:i:s', $splFileInfo->getMTime()) . ')'; 51 } elseif ($splFileInfo->isDir()) { 52 echo ' (ディレクトリ)'; 53 } 54 echo PHP_EOL; 55 } 56 } catch (UnexpectedValueException $e) { 57 // ディレクトリが存在しない、またはアクセス権がない場合などに発生する可能性があります。 58 echo "エラー: ディレクトリ '{$directoryPath}' を開けませんでした。メッセージ: " . $e->getMessage() . PHP_EOL; 59 } finally { 60 // サンプルコードが作成した一時ディレクトリであればクリーンアップします。 61 if ($cleanupRequired) { 62 echo "--------------------------------------------------------" . PHP_EOL; 63 echo "サンプル用に作成された一時ディレクトリをクリーンアップ中..." . PHP_EOL; 64 rrmdir($directoryPath); // ヘルパー関数でディレクトリを削除 65 echo "クリーンアップが完了しました。" . PHP_EOL; 66 } 67 } 68} 69 70/** 71 * ディレクトリとその内容を再帰的に削除するヘルパー関数。 72 * 主にこのサンプルコードが作成した一時ディレクトリのクリーンアップに使用されます。 73 * 74 * @param string $dir 削除するディレクトリのパス 75 */ 76function rrmdir(string $dir): void 77{ 78 if (!file_exists($dir)) { 79 return; 80 } 81 82 // RecursiveDirectoryIterator と RecursiveIteratorIterator を使用して、 83 // ディレクトリ内のすべてのファイルとサブディレクトリをリストアップします。 84 // CHILD_FIRST は、子要素を先に処理してから親ディレクトリを処理するために使用します。 85 $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); 86 $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); 87 88 foreach ($files as $file) { 89 if ($file->isDir()) { 90 rmdir($file->getPathname()); // ディレクトリを削除 91 } else { 92 unlink($file->getPathname()); // ファイルを削除 93 } 94 } 95 rmdir($dir); // 最上位のディレクトリを削除 96} 97 98// スクリプトの実行部分 99// 一意な一時ディレクトリのパスを生成し、メイン関数に渡します。 100// これにより、ユーザーのファイルシステムに影響を与えずに単体でテストできます。 101$tempSampleDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_getfilelist_sample_' . uniqid(); 102getFilesRecursivelyUsingGetFileInfo($tempSampleDir);
RecursiveDirectoryIterator::getFileInfo()メソッドは、PHPでディレクトリ内のファイルやサブディレクトリを再帰的に走査する際に、現在処理している要素の詳細な情報を取得するために使用されます。このメソッドはRecursiveDirectoryIteratorクラスに属しており、多くの場合、RecursiveIteratorIteratorと組み合わせて活用されます。
引数$classには、取得する情報オブジェクトのクラス名を指定できますが、通常はデフォルトのSplFileInfo::classが使用され、SplFileInfoクラスのインスタンスが返されます。このSplFileInfoオブジェクトには、ファイルやディレクトリのフルパス、種類(ファイルかディレクトリか)、サイズ、最終更新日時など、ファイルシステム上の様々な情報が含まれています。
サンプルコードでは、一時的なディレクトリを作成し、その内容を再帰的に走査しています。ループ内で$iterator->getInnerIterator()->getFileInfo()を呼び出すことで、現在のファイルまたはディレクトリに関するSplFileInfoオブジェクトを取得し、その情報を用いてパスや種類、サイズなどを表示しています。これにより、ディレクトリ構造を探索し、各要素の具体的な属性を効率的に取得する方法を示しており、ファイルリストの作成などに役立ちます。
このサンプルコードでは、RecursiveIteratorIteratorがラップしているRecursiveDirectoryIteratorの内部インスタンスからgetFileInfo()メソッドを呼び出しています。foreachループで直接取得する変数もSplFileInfoオブジェクトですが、getFileInfo()が内部イテレータから情報を取得する役割を理解しておきましょう。RecursiveDirectoryIteratorは指定されたディレクトリを、RecursiveIteratorIteratorはサブディレクトリも再帰的に走査するために組み合わせて使用します。一時ディレクトリの作成と削除はサンプルコードが単体で動作するための補助機能であり、実際の運用では既存のディレクトリパスを指定し、ファイルのアクセス権やパスの存在確認、そしてエラー発生時の適切な例外処理に常に配慮が必要です。