【PHP8.x】DirectoryIterator::isFile()メソッドの使い方
isFileメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
isFileメソッドは、PHPのDirectoryIteratorクラスに属し、ディレクトリ内の項目を反復処理する際に、現在指している項目が通常のファイルであるかどうかを判定するメソッドです。このメソッドは、ディレクトリ、シンボリックリンク、デバイスファイルなどの他のファイルシステムのエントリタイプと、通常のファイルを区別するために使用されます。
具体的には、DirectoryIteratorオブジェクトが現在指すパスがファイルシステム上の通常のファイル(例えば、テキストファイル、画像ファイル、実行可能ファイルなど)である場合にtrueを返します。一方で、そのパスがディレクトリであったり、シンボリックリンク、存在しないパス、あるいはその他の特殊なファイルタイプである場合にはfalseを返します。
このメソッドは、ディレクトリ内の内容を処理する際に、ファイルだけを対象にしたい場合や、ファイルとディレクトリで異なる処理を実行したい場合に非常に有用です。例えば、特定のディレクトリ内にあるすべてのファイルのリストを作成したり、ファイルのサイズや更新日時などの情報を取得する前に、その項目が確実にファイルであることを確認するために利用できます。システムエンジニアを目指す方にとって、ファイルシステムの操作は基本的なスキルであり、本メソッドはその際によく利用される重要な機能の一つです。
構文(syntax)
1<?php 2 3$dir = new DirectoryIterator('.'); // 現在のディレクトリを対象とする 4foreach ($dir as $fileinfo) { 5 if ($fileinfo->isFile()) { // isFile() メソッドを呼び出し、通常のファイルかどうかをチェック 6 echo $fileinfo->getFilename() . " はファイルです。\n"; 7 } 8} 9 10?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
bool
現在のディレクトリ項目がファイルである場合に true を、それ以外の場合に false を返します。
サンプルコード
PHP DirectoryIterator でファイル判定する
1<?php 2 3/** 4 * 指定されたディレクトリ内のエントリを走査し、ファイルであるかを判定して表示します。 5 * 6 * @param string $directoryPath 走査するディレクトリのパス 7 * @return void 8 */ 9function scanDirectoryForFiles(string $directoryPath): void 10{ 11 // 指定されたパスがディレクトリとして存在するかを確認します 12 if (!is_dir($directoryPath)) { 13 echo "エラー: 指定されたパス '{$directoryPath}' は有効なディレクトリではありません。\n"; 14 return; 15 } 16 17 echo "ディレクトリ '{$directoryPath}' の内容:\n"; 18 19 try { 20 // DirectoryIterator クラスを使用してディレクトリを反復処理します 21 // このクラスは、ディレクトリ内の各エントリの情報を提供するオブジェクトを生成します 22 foreach (new DirectoryIterator($directoryPath) as $fileInfo) { 23 // '.' と '..' は現在のディレクトリと親ディレクトリを表す特殊なエントリなのでスキップします 24 if ($fileInfo->isDot()) { 25 continue; 26 } 27 28 // isFile() メソッドを使用して、現在のエントリが通常のファイルであるかを判定します 29 // このメソッドは、ファイルであれば true、ディレクトリやシンボリックリンクなどであれば false を返します 30 if ($fileInfo->isFile()) { 31 echo "- ファイル: " . $fileInfo->getFilename() . "\n"; 32 } else { 33 // isFile() が false の場合、それはファイルではないことを意味します(ほとんどの場合、ディレクトリです) 34 echo "- ディレクトリまたはその他: " . $fileInfo->getFilename() . "\n"; 35 } 36 } 37 } catch (UnexpectedValueException $e) { 38 // ディレクトリへのアクセス権がない場合などに発生する可能性があります 39 echo "エラー: ディレクトリ '{$directoryPath}' へのアクセスに失敗しました。(" . $e->getMessage() . ")\n"; 40 } 41} 42 43// スクリプトが実行されている現在のディレクトリを対象に走査します。 44// このスクリプトと同じディレクトリにいくつかのファイルやサブディレクトリを作成して試してみてください。 45// 例: 46// - index.php (このスクリプト) 47// - myfile.txt 48// - mysubdir/ 49scanDirectoryForFiles(__DIR__); 50 51// 他のディレクトリを試すこともできます (例: /tmp ディレクトリなど) 52// scanDirectoryForFiles('/tmp'); 53 54?>
PHPのDirectoryIterator::isFileメソッドは、ディレクトリ内のエントリが通常のファイルであるかを判定するために使用されます。このメソッドは引数を取らず、戻り値として真偽値(trueまたはfalse)を返します。
具体的には、DirectoryIteratorクラスを使ってディレクトリを走査し、取得した各エントリ(ファイルやサブディレクトリなど)に対してisFile()メソッドを呼び出すことで、それがファイルである場合にtrueを、ディレクトリやシンボリックリンクなどファイル以外のタイプである場合にfalseを返します。これにより、プログラムはディレクトリ内の項目を種類別に判別し、それぞれに応じた処理を行うことが可能になります。
サンプルコードでは、DirectoryIteratorでループ処理中に各項目を$fileInfoオブジェクトとして取得し、$fileInfo->isFile()を用いて現在のエエントリがファイルか否かを判断しています。ファイルであれば「ファイル:」として表示し、そうでなければ「ディレクトリまたはその他:」と表示を分けています。この機能は、特定のファイルだけを処理対象としたい場合など、ファイルシステム操作において非常に有用です。PHPにはグローバル関数としてis_file()も存在しますが、DirectoryIterator::isFile()はオブジェクト指向的なアプローチで、反復処理中のエントリの状態を効率的に確認できます。
DirectoryIterator クラスの isFile() メソッドは、走査中のエントリが通常のファイルであるかを判定します。PHPには同名のグローバル関数 is_file() も存在しますので、混同しないようにしてください。isFile() は DirectoryIterator オブジェクトのエントリが通常のファイルであるかを判定するメソッドで、ファイルであれば true を、ディレクトリやシンボリックリンクなどであれば false を返します。
ディレクトリ内の特殊なエントリである . (カレントディレクトリ) や .. (親ディレクトリ) は isDot() メソッドで判断し、通常は処理対象から除外することが推奨されます。また、指定されたパスがディレクトリでない場合や、アクセス権がない場合には UnexpectedValueException が発生する可能性があります。そのため、try-catch ブロックによるエラーハンドリングを適切に行うことで、予期せぬエラーを防ぎ、より堅牢なコードになります。ディレクトリパスの指定には、現在のスクリプトがあるディレクトリを示すマジック定数 __DIR__ が便利です。