【PHP8.x】FilesystemIterator::getFileInfo()メソッドの使い方
getFileInfoメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getFileInfoメソッドは、PHP 8で提供されるFilesystemIteratorクラスに属し、ファイルシステムを反復処理する際に、現在の位置にあるファイルやディレクトリの詳細な情報を取得するために使用されるメソッドです。このメソッドを呼び出すと、該当するファイルやディレクトリの情報を一まとめにしたSplFileInfoオブジェクトが返されます。
SplFileInfoオブジェクトは、ファイル名、パス、ファイルサイズ、最終更新日時、ファイルの種類(通常のファイルかディレクトリかなど)、読み書きのパーミッションといった多岐にわたる属性を保持しています。そのため、FilesystemIteratorを使って特定のディレクトリ内の要素を一つずつ調べていく際、それぞれの要素がどのような特性を持っているのかを簡単に把握し、それに基づいて様々な処理を実行できます。
例えば、特定の拡張子を持つファイルだけを抽出したい場合や、更新日時が新しいファイルだけをリストアップするような場面で、getFileInfoメソッドは大変役立ちます。このメソッドを利用することで、ファイルシステム操作をより効率的かつ柔軟に行うことが可能となり、システム開発におけるファイル管理処理の実装を簡潔に記述できるようになります。
構文(syntax)
1<?php 2 3// 現在のディレクトリを指す FilesystemIterator を作成 4$iterator = new FilesystemIterator(__DIR__); 5 6// イテレータを最初の要素に巻き戻します 7$iterator->rewind(); 8 9// イテレータが有効な要素を指している場合 10if ($iterator->valid()) { 11 // FilesystemIterator::getFileInfo() を呼び出し、現在の要素の SplFileInfo オブジェクトを取得 12 $fileInfo = $iterator->getFileInfo(); 13 14 // 取得した SplFileInfo オブジェクトからファイル名を表示 15 echo $fileInfo->getFilename() . PHP_EOL; 16} 17 18?>
引数(parameters)
?string $class = NULL
- ?string $class = NULL: FileInfoオブジェクトの代わりに返すオブジェクトのクラス名。指定しない場合はデフォルトのSplFileInfoクラスが使用される。
戻り値(return)
SplFileInfo
FilesystemIterator::getFileInfoメソッドは、現在のエントリを表すSplFileInfoオブジェクトを返します。このオブジェクトは、ファイル名、パス、パーミッションなどのファイルに関する詳細情報を提供します。
サンプルコード
FilesystemIterator::getFileInfo()でファイル情報を取得する
1<?php 2 3/** 4 * FilesystemIterator::getFileInfo() メソッドの使用例。 5 * このスクリプトは、実行中のディレクトリ内のファイルとサブディレクトリの情報を表示します。 6 */ 7 8// このスクリプトが存在するディレクトリのパスを取得 9$directoryPath = __DIR__; 10 11try { 12 // FilesystemIterator を使用してディレクトリを反復処理します。 13 // FilesystemIterator::SKIP_DOTS フラグは、特殊なエントリである '.' と '..' をスキップします。 14 $iterator = new FilesystemIterator($directoryPath, FilesystemIterator::SKIP_DOTS); 15 16 echo "--- ディレクトリ: {$directoryPath} の情報リスト ---\n\n"; 17 18 // ディレクトリ内の各ファイルやサブディレクトリをループ処理 19 foreach ($iterator as $file) { 20 // getFileInfo() メソッドを呼び出し、現在のエントリに関する SplFileInfo オブジェクトを取得します。 21 // このオブジェクトは、ファイル名、サイズ、タイプなど、様々なファイル情報を提供します。 22 // ($file 自体も SplFileInfo オブジェクトであるため、$file->getFilename() のように直接アクセスすることも可能ですが、 23 // getFileInfo() メソッドの使用例として明示的に呼び出しています。) 24 $fileInfo = $iterator->getFileInfo(); 25 26 echo "ファイル/ディレクトリ名: " . $fileInfo->getFilename() . "\n"; 27 echo "フルパス: " . $fileInfo->getPathname() . "\n"; 28 29 if ($fileInfo->isDir()) { 30 echo "タイプ: ディレクトリ\n"; 31 } elseif ($fileInfo->isFile()) { 32 echo "タイプ: ファイル\n"; 33 echo "サイズ: " . $fileInfo->getSize() . " バイト\n"; 34 } else { 35 echo "タイプ: その他\n"; 36 } 37 echo "-----------------------------------\n\n"; 38 } 39 40} catch (UnexpectedValueException $e) { 41 // 指定されたパスがディレクトリではない、または存在しない場合に発生するエラーを処理 42 echo "エラー: 指定されたディレクトリ '{$directoryPath}' を開けませんでした。\n"; 43 echo "詳細: " . $e->getMessage() . "\n"; 44} catch (RuntimeException $e) { 45 // その他のランタイムエラー(例: 権限の問題)を処理 46 echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n"; 47}
PHPのFilesystemIteratorクラスに属するgetFileInfo()メソッドは、ディレクトリを反復処理する際に、現在処理しているファイルやサブディレクトリに関する詳細な情報を取得するために使用されます。
このメソッドの引数?string $class = NULLは、戻り値となるSplFileInfoオブジェクトを継承した、特定のカスタムクラスのインスタンスを生成したい場合に指定できますが、通常はデフォルトのNULLで問題ありません。戻り値は常にSplFileInfoオブジェクトであり、このオブジェクトを通じて、ファイル名、フルパス、サイズ、最終更新日時、パーミッション、タイプ(ファイルかディレクトリかなど)といった多岐にわたるファイルシステムの情報にアクセスできます。
サンプルコードでは、まずFilesystemIteratorを使用して現在のディレクトリを走査しています。foreachループの中で、$iterator->getFileInfo()を呼び出すことで、現在のエントリ(ファイルまたはディレクトリ)に対応するSplFileInfoオブジェクトを取得し、それを$fileInfo変数に代入しています。その後、$fileInfo->getFilename()や$fileInfo->getPathname()、$fileInfo->isDir()、$fileInfo->isFile()、$fileInfo->getSize()といったメソッドを利用して、それぞれの情報を抽出し表示しています。これにより、ファイルシステムの内容を効率的に調べ、表示することが可能になります。例外処理も導入されており、エラー発生時にも適切に対応できます。
foreachループで取得する$file変数は、すでにSplFileInfoオブジェクトです。多くのファイル情報は$fileから直接取得できるため、getFileInfo()を明示的に呼び出す必要がない場合もあります。これはイテレータの現在位置の情報を取得するメソッドと理解してください。ファイルシステム操作はエラーが発生しやすいため、サンプルコードのようにtry-catchでUnexpectedValueExceptionやRuntimeExceptionを適切に処理し、プログラムが停止しないよう堅牢なコードを記述することが重要です。また、ディレクトリの特殊エントリ.と..は通常不要なため、FilesystemIterator::SKIP_DOTSフラグでスキップすることをお勧めします。
PHPでFilesystemIteratorを使いファイルリストを取得する
1<?php 2 3/** 4 * 指定されたディレクトリ内のファイルとディレクトリのリストを取得し、その情報を表示します。 5 * 6 * FilesystemIterator を使用してディレクトリを反復処理し、getFileInfo() メソッドで 7 * 各エントリの SplFileInfo オブジェクトを取得して情報を表示します。 8 * 9 * @param string $directoryPath 処理対象のディレクトリパス 10 */ 11function displayFileList(string $directoryPath): void 12{ 13 // ディレクトリが存在しない場合はエラーメッセージを表示して終了します。 14 if (!is_dir($directoryPath)) { 15 echo "エラー: 指定されたディレクトリ '{$directoryPath}' が見つかりません。\n"; 16 return; 17 } 18 19 try { 20 // FilesystemIterator を使用してディレクトリの内容を反復処理します。 21 // FilesystemIterator::SKIP_DOTS フラグは、特殊なエントリである '.' (カレントディレクトリ) と '..' (親ディレクトリ) をスキップします。 22 $iterator = new FilesystemIterator($directoryPath, FilesystemIterator::SKIP_DOTS); 23 24 echo "ディレクトリ '{$directoryPath}' 内のファイル/ディレクトリ一覧:\n"; 25 26 // ディレクトリ内の各エントリをループ処理します。 27 // foreach ($iterator as $item) の $item は、FilesystemIterator の現在の要素である SplFileInfo オブジェクトです。 28 // ここでは、FilesystemIterator の getFileInfo() メソッドを明示的に呼び出して SplFileInfo オブジェクトを取得します。 29 foreach ($iterator as $item) { 30 // FilesystemIterator の getFileInfo() メソッドを呼び出し、SplFileInfo オブジェクトを取得します。 31 // 引数 $class は NULL のままで、デフォルトの SplFileInfo インスタンスが返されます。 32 $fileInfo = $iterator->getFileInfo(); 33 34 // 取得した SplFileInfo オブジェクトからファイル情報を表示します。 35 echo sprintf( 36 "- %s (タイプ: %s, サイズ: %s バイト)\n", 37 $fileInfo->getFilename(), // ファイル名またはディレクトリ名を取得 38 $fileInfo->getType(), // エントリのタイプ (例: 'file', 'dir', 'link') を取得 39 $fileInfo->getSize() // ファイルサイズをバイト単位で取得 (ディレクトリの場合は通常0) 40 ); 41 } 42 } catch (UnexpectedValueException $e) { 43 // ディレクトリのパスが不正であったり、アクセス権がないなどのエラーを捕捉します。 44 echo "エラー: ディレクトリ '{$directoryPath}' の読み込み中に問題が発生しました: " . $e->getMessage() . "\n"; 45 } catch (RuntimeException $e) { 46 // その他の実行時エラーを捕捉します。 47 echo "ランタイムエラー: " . $e->getMessage() . "\n"; 48 } 49} 50 51// スクリプトが実行されている現在のディレクトリを対象にファイルリストを表示します。 52// このスクリプトと同じディレクトリ内にテスト用のファイルやディレクトリを作成して実行してみてください。 53// 例: 54// // コマンドラインで以下のコマンドを実行 55// mkdir my_test_dir 56// touch my_test_dir/document.txt 57// echo "Hello World" > my_test_dir/greeting.log 58// mkdir my_test_dir/sub_folder 59// // その後、このPHPスクリプトをPHPインタープリタで実行 60// php your_script_name.php 61displayFileList(__DIR__); 62
このPHPサンプルコードは、指定されたディレクトリ内のファイルとディレクトリの一覧、およびその詳細な情報を取得して表示する方法を示しています。まず、FilesystemIteratorクラスを使用してディレクトリの内容を効率的に反復処理します。このクラスは、ディレクトリ内の各エエントリをオブジェクトとして扱えるようにし、特殊なエントリ(.や..)をスキップするなどの便利な機能を提供します。
反復処理中に、FilesystemIterator::getFileInfo()メソッドを呼び出すことで、現在のエントリに関する詳細な情報を格納したSplFileInfoオブジェクトを取得します。このメソッドの引数$classは、通常はNULLとして使用され、デフォルトのSplFileInfoインスタンスが戻り値として返されます。SplFileInfoオブジェクトは、ファイル名を取得するgetFilename()、エントリのタイプを取得するgetType()、ファイルサイズを取得するgetSize()など、ファイルに関する様々なプロパティにアクセスするための便利な機能を提供します。
サンプルコードでは、取得したSplFileInfoオブジェクトからこれらの情報を抽出し、整形して表示しています。また、ディレクトリが存在しない場合や読み込み時にエラーが発生した場合のための例外処理も含まれており、堅牢なファイルシステム操作の基本を示しています。これにより、初心者の方でもPHPでファイルリストを扱う際の基本的な手順を理解できるようになっています。
このコードでは、foreach ($iterator as $item) の $item がすでにSplFileInfoオブジェクトであるため、ループ内で $iterator->getFileInfo() を再度呼び出す必要はありません。foreach ($iterator as $fileInfo) とすることで直接ファイル情報を扱え、コードがより簡潔になります。ディレクトリの存在確認とtry-catchによる例外処理は、ファイルシステムの操作において不可欠であり、指定されたパスが無効な場合やアクセス権がない場合でも安全に処理できます。また、FilesystemIterator::SKIP_DOTSフラグの使用は、.や..といった特殊なエントリを自動的に除外し、目的のファイルリストのみを取得するのに役立ちます。